[PATCH 64/71] NAN: Extend transmit function to allow additional NAN attributes
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Apr 1 15:02:13 PDT 2026
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 e862e9b31d..34f268d880 100644
--- a/src/ap/nan_usd_ap.c
+++ b/src/ap/nan_usd_ap.c
@@ -279,5 +279,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 47e76cae69..35eb51c57a 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -294,7 +294,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;
@@ -339,6 +340,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;
@@ -412,6 +415,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, forced_addr, a3, buf);
wpabuf_free(buf);
@@ -518,7 +526,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);
}
@@ -1238,7 +1246,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:
@@ -1308,7 +1316,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);
if (!srv->is_p2p && !srv->sync)
nan_de_pause_state(srv, peer_addr, instance_id);
@@ -2098,7 +2107,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;
@@ -2129,7 +2139,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 8b881ab455..9be6aa644b 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -228,7 +228,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 6cc7cc1dc5..a943d2f1ed 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -3053,7 +3053,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.53.0
More information about the Hostap
mailing list