[PATCH 1/3] NAN: Add peer on discovery before notifying discovery result

Junyu Lai junyulai at google.com
Mon Oct 12 23:08:15 PDT 2026


In wpas_nan_de_rx_sdf(), nan_de_rx_sdf() invokes the discovery_result
callback (wpas_nan_de_discovery_result()) before nan_add_peer() adds the
peer to wpa_s->nan. As a result, when wpas_nan_de_discovery_result()
runs for the first Service Discovery Frame (SDF) from a newly discovered
peer, the peer entry does not yet exist in wpa_s->nan.

Pass the raw SDF attribute buffer (raw_buf and raw_buf_len) in struct
nan_discovery_result and call nan_add_peer() in
wpas_nan_de_discovery_result() if the peer is not already in wpa_s->nan.

This is safe because wpa_s->nan, nan_get_peer(), and res->raw_buf are
checked before adding the peer, and res->raw_buf points to the received
SDF payload which remains valid for the duration of the synchronous
discovery_result callback.

Signed-off-by: Junyu Lai <junyulai at google.com>
---
 src/common/nan_de.c             |  2 ++
 src/common/nan_de.h             |  2 ++
 wpa_supplicant/nan_supplicant.c | 17 +++++++++++++++++
 3 files changed, 21 insertions(+)

diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index 41f9e3c7a..fbda4e39b 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -2337,6 +2337,8 @@ send_event:
 	res.pmkid_list = pmkid_count > 0 ? pmkid_list : NULL;
 	res.pmkid_count = pmkid_count;
 	res.orig_addr = orig_addr;
+	res.raw_buf = buf;
+	res.raw_buf_len = buf_len;
 
 	if (de->cb.discovery_result) {
 		char *locale = NULL, *vendor_name = NULL;
diff --git a/src/common/nan_de.h b/src/common/nan_de.h
index 36d8a4795..862743806 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -47,6 +47,8 @@ struct nan_discovery_result {
 	const char *psi_vendor_name;
 	const char *psi_model_name;
 	const char *psi_pairing_name;
+	const u8 *raw_buf;
+	size_t raw_buf_len;
 };
 
 struct nan_callbacks {
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 173d2a0ce..6975553b9 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -18,6 +18,7 @@
 #include "wpa_supplicant_i.h"
 #include "driver_i.h"
 #include "nan/nan.h"
+#include "nan/nan_i.h"
 #include "config.h"
 #include "offchannel.h"
 #include "notify.h"
@@ -4787,6 +4788,22 @@ wpas_nan_de_discovery_result(void *ctx, struct nan_discovery_result *res)
 {
 	struct wpa_supplicant *wpa_s = ctx;
 
+#ifdef CONFIG_NAN
+	if (wpa_s->nan && !nan_get_peer(wpa_s->nan, res->peer_addr)) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Peer " MACSTR
+			   " not in list, adding it on discovery",
+			   MAC2STR(res->peer_addr));
+		if (res->raw_buf) {
+			nan_add_peer(wpa_s->nan, res->peer_addr, NULL, 0,
+				     res->raw_buf, res->raw_buf_len);
+		} else {
+			wpa_printf(MSG_DEBUG,
+				   "NAN: No raw buffer to add peer");
+		}
+	}
+#endif /* CONFIG_NAN */
+
 	wpas_notify_nan_discovery_result(wpa_s, res);
 }
 
-- 
2.56.0.385.gd3acb90ef8-goog




More information about the Hostap mailing list