[RFC 07/13] NAN: Extend transmit function to allow additional NAN attributes

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:57:19 PST 2025


Transmit DE callback is used to send follow up SDF frames. These frames
can carry additional attributes which may be generated outside of NAN
DE module. Extend the API accordingly.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/ap/nan_usd_ap.c             |  2 +-
 src/common/nan_de.c             | 22 ++++++++++++++++------
 src/common/nan_de.h             |  4 +++-
 wpa_supplicant/nan_supplicant.c |  2 +-
 4 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/src/ap/nan_usd_ap.c b/src/ap/nan_usd_ap.c
index 37ff9f1291..802a880cbe 100644
--- a/src/ap/nan_usd_ap.c
+++ b/src/ap/nan_usd_ap.c
@@ -268,5 +268,5 @@ int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
 	if (!hapd->nan_de)
 		return -1;
 	return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr,
-			       req_instance_id);
+			       req_instance_id, NULL);
 }
diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index 6070966f11..1e2833bb4b 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -280,7 +280,8 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
 			  unsigned int wait_time,
 			  enum nan_service_control_type type,
 			  const u8 *dst, const u8 *a3, u8 req_instance_id,
-			  const struct wpabuf *ssi)
+			  const struct wpabuf *ssi,
+			  const struct wpabuf *attrs)
 {
 	struct wpabuf *buf;
 	size_t len = 0, sda_len, sdea_len;
@@ -324,6 +325,8 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
 	if (de->cb.add_extra_attrs)
 		len += 256;
 
+	len += attrs ? wpabuf_len(attrs) : 0;
+
 	buf = nan_de_alloc_sdf(len);
 	if (!buf)
 		return;
@@ -394,6 +397,11 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
 	if (de->cb.add_extra_attrs)
 		de->cb.add_extra_attrs(de->cb.ctx, buf);
 
+	if (attrs) {
+		wpa_printf(MSG_DEBUG, "NAN: Add extra NAN attributes");
+		wpabuf_put_buf(buf, attrs);
+	}
+
 	nan_de_tx(de, srv->sync ? 0 : srv->freq, srv->sync ? 0 : wait_time,
 		  dst, de->nmi, a3, buf);
 	wpabuf_free(buf);
@@ -501,7 +509,7 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,
 	}
 
 	nan_de_tx_sdf(de, srv, wait_time, type, network_id, bssid,
-		      req_instance_id, srv->ssi);
+		      req_instance_id, srv->ssi, NULL);
 	os_get_reltime(&srv->last_multicast);
 }
 
@@ -1155,7 +1163,7 @@ static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 		 * Service Specific Info field if it received a matching
 		 * unsolicited Publish message. */
 		nan_de_transmit(de, srv->id, NULL, NULL, peer_addr,
-				instance_id);
+				instance_id, NULL);
 	}
 
 send_event:
@@ -1223,7 +1231,8 @@ static bool nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
 
 	nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_PUBLISH,
 		      srv->publish.solicited_multicast ?
-		      network_id : peer_addr, a3, instance_id, srv->ssi);
+		      network_id : peer_addr, a3, instance_id, srv->ssi,
+		      NULL);
 offload:
 	if (!srv->publish.disable_events && de->cb.replied)
 		de->cb.replied(de->cb.ctx, srv->id, peer_addr, instance_id,
@@ -1993,7 +2002,8 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id)
 
 int nan_de_transmit(struct nan_de *de, int handle,
 		    const struct wpabuf *ssi, const struct wpabuf *elems,
-		    const u8 *peer_addr, u8 req_instance_id)
+		    const u8 *peer_addr, u8 req_instance_id,
+		    const struct wpabuf *nan_attrs)
 {
 	struct nan_de_service *srv;
 	const u8 *a3;
@@ -2024,7 +2034,7 @@ int nan_de_transmit(struct nan_de *de, int handle,
 	else
 		a3 = network_id;
 	nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP,
-		      peer_addr, a3, req_instance_id, ssi);
+		      peer_addr, a3, req_instance_id, ssi, nan_attrs);
 
 	srv->listen_stopped = false;
 	return 0;
diff --git a/src/common/nan_de.h b/src/common/nan_de.h
index 18b9922389..628a768bd0 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -220,7 +220,9 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id);
  * req_instance_id = peer publish_id or subscribe_id */
 int nan_de_transmit(struct nan_de *de, int handle,
 		    const struct wpabuf *ssi, const struct wpabuf *elems,
-		    const u8 *peer_addr, u8 req_instance_id);
+		    const u8 *peer_addr, u8 req_instance_id,
+		    const struct wpabuf *nan_attrs);
+
 void nan_de_dw_trigger(struct nan_de *de, int freq);
 void nan_de_set_cluster_id(struct nan_de *de, const u8 *cluster_id);
 bool nan_de_is_valid_instance_id(struct nan_de *de, int handle,
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 024412617c..1815455c9d 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -2968,7 +2968,7 @@ int wpas_nan_transmit(struct wpa_supplicant *wpa_s, int handle,
 	if (!wpa_s->nan_de)
 		return -1;
 	return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
-			       req_instance_id);
+			       req_instance_id, NULL);
 }
 
 
-- 
2.49.0




More information about the Hostap mailing list