[PATCH v3 09/46] NAN: Pass forced_addr to remain-on-channel listen callback

Kavita Kavita kavita.kavita at oss.qualcomm.com
Wed May 13 02:59:33 PDT 2026


From: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>

Extend the nan_callbacks.listen() signature to accept an optional
forced_addr parameter, allowing a per-service source MAC address
to be propagated to the driver's remain-on-channel request.

In nan_de_timer(), pass srv->forced_addr (or NULL if not set) to
de->cb.listen() at both call sites. In the supplicant, store the
address in wpas_nan_usd_listen_work and pass it as filter_addr to
wpa_drv_remain_on_channel() when the driver advertises
WPA_DRIVER_FLAGS2_ROC_ADDR_FILTER support.

Update hostapd_nan_de_listen() stub signature to match.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>
---
 src/ap/nan_usd_ap.c             |  2 +-
 src/common/nan_de.c             |  9 ++++++---
 src/common/nan_de.h             |  3 ++-
 wpa_supplicant/nan_supplicant.c | 14 ++++++++++++--
 4 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/ap/nan_usd_ap.c b/src/ap/nan_usd_ap.c
index 8620644cb..86183deb3 100644
--- a/src/ap/nan_usd_ap.c
+++ b/src/ap/nan_usd_ap.c
@@ -37,7 +37,7 @@ static int hostapd_nan_de_tx(void *ctx, unsigned int freq,
 
 
 static int hostapd_nan_de_listen(void *ctx, unsigned int freq,
-			      unsigned int duration)
+			      unsigned int duration, const u8 *forced_addr)
 {
 	return 0;
 }
diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index 72ee6fe47..f620da808 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -958,8 +958,9 @@ static void nan_de_timer(void *eloop_ctx, void *timeout_ctx)
 			}
 			if ((unsigned int) duration > de->max_listen)
 				duration = de->max_listen;
-			if (de->cb.listen(de->cb.ctx, srv->freq, duration) ==
-			    0) {
+			if (de->cb.listen(de->cb.ctx, srv->freq, duration,
+				  srv->forced_addr_set ?
+				  srv->forced_addr : NULL) == 0) {
 				wpa_printf(MSG_DEBUG,
 					   "NAN: Publisher in pauseState - started listen on %u MHz",
 					   srv->freq);
@@ -994,7 +995,9 @@ static void nan_de_timer(void *eloop_ctx, void *timeout_ctx)
 			duration = nan_de_listen_duration(de, srv);
 
 			started = true;
-			if (de->cb.listen(de->cb.ctx, srv->freq, duration) == 0)
+			if (de->cb.listen(de->cb.ctx, srv->freq, duration,
+					  srv->forced_addr_set ?
+					  srv->forced_addr : NULL) == 0)
 				de->listen_freq = srv->freq;
 		}
 
diff --git a/src/common/nan_de.h b/src/common/nan_de.h
index 95ca161f2..6e06f61ea 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -49,7 +49,8 @@ struct nan_callbacks {
 	int (*tx)(void *ctx, unsigned int freq, unsigned int wait_time,
 		  const u8 *dst, const u8 *src, const u8 *bssid,
 		  const struct wpabuf *buf);
-	int (*listen)(void *ctx, unsigned int freq, unsigned int duration);
+	int (*listen)(void *ctx, unsigned int freq, unsigned int duration,
+		      const u8 *forced_addr);
 
 	/* NAN DE Events */
 	void (*discovery_result)(void *ctx, struct nan_discovery_result *res);
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 5c162ad8b..705643ca7 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -4174,6 +4174,8 @@ static int wpas_nan_de_tx(void *ctx, unsigned int freq, unsigned int wait_time,
 struct wpas_nan_usd_listen_work {
 	unsigned int freq;
 	unsigned int duration;
+	u8 forced_addr[ETH_ALEN];
+	bool forced_addr_set;
 };
 
 
@@ -4224,7 +4226,11 @@ static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
 		duration = wpa_s->max_remain_on_chan;
 	wpa_printf(MSG_DEBUG, "NAN: Start listen on %u MHz for %u ms",
 		   lwork->freq, duration);
-	if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration, NULL) < 0) {
+	if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration,
+				      (lwork->forced_addr_set &&
+				       (wpa_s->drv_flags2 &
+					WPA_DRIVER_FLAGS2_ROC_ADDR_FILTER)) ?
+				      lwork->forced_addr : NULL) < 0) {
 		wpa_printf(MSG_DEBUG,
 			   "NAN: Failed to request the driver to remain on channel (%u MHz) for listen",
 			   lwork->freq);
@@ -4241,7 +4247,7 @@ static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
 
 
 static int wpas_nan_de_listen(void *ctx, unsigned int freq,
-			      unsigned int duration)
+			      unsigned int duration, const u8 *forced_addr)
 {
 	struct wpa_supplicant *wpa_s = ctx;
 	struct wpas_nan_usd_listen_work *lwork;
@@ -4251,6 +4257,10 @@ static int wpas_nan_de_listen(void *ctx, unsigned int freq,
 		return -1;
 	lwork->freq = freq;
 	lwork->duration = duration;
+	if (forced_addr) {
+		os_memcpy(lwork->forced_addr, forced_addr, ETH_ALEN);
+		lwork->forced_addr_set = true;
+	}
 
 	if (!radio_add_work(wpa_s, freq, "nan-usd-listen", 0,
 			    wpas_nan_usd_start_listen_cb, lwork)) {
-- 
2.34.1




More information about the Hostap mailing list