[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