[PATCH 86/92] NAN: Aggregate NAN discovery result information into a struct

Andrei Otcheretianski andrei.otcheretianski at intel.com
Wed Apr 22 05:24:17 PDT 2026


From: Ilan Peer <ilan.peer at intel.com>

So it would be later easier to add additional information
to the discovery result.

Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/ap/nan_usd_ap.c             | 24 +++++++-------
 src/common/nan_de.c             | 48 +++++++++++++++------------
 src/common/nan_de.h             | 25 +++++++++------
 wpa_supplicant/nan_supplicant.c | 14 ++------
 wpa_supplicant/notify.c         | 57 ++++++++++++++++-----------------
 wpa_supplicant/notify.h         | 11 ++-----
 6 files changed, 87 insertions(+), 92 deletions(-)

diff --git a/src/ap/nan_usd_ap.c b/src/ap/nan_usd_ap.c
index 41e99510d9..506b612a0a 100644
--- a/src/ap/nan_usd_ap.c
+++ b/src/ap/nan_usd_ap.c
@@ -44,28 +44,26 @@ static int hostapd_nan_de_listen(void *ctx, unsigned int freq,
 
 
 static void
-hostapd_nan_de_discovery_result(void *ctx, int subscribe_id,
-				enum nan_service_protocol_type srv_proto_type,
-				const u8 *ssi, size_t ssi_len,
-				int peer_publish_id, const u8 *peer_addr,
-				bool fsd, bool fsd_gas,
-				const u8 *pmkid_list, size_t pmkid_count,
-				const u8 *cipher_suite,
-				size_t n_cipher_suite)
+hostapd_nan_de_discovery_result(void *ctx,
+				struct nan_discovery_result *res)
 {
 	struct hostapd_data *hapd = ctx;
 	char *ssi_hex;
 
-	ssi_hex = os_zalloc(2 * ssi_len + 1);
+	ssi_hex = os_zalloc(2 * res->ssi_len + 1);
 	if (!ssi_hex)
 		return;
-	if (ssi)
-		wpa_snprintf_hex(ssi_hex, 2 * ssi_len + 1, ssi, ssi_len);
+	if (res->ssi)
+		wpa_snprintf_hex(ssi_hex, 2 * res->ssi_len + 1,
+				 res->ssi, res->ssi_len);
 	wpa_msg(hapd->msg_ctx, MSG_INFO, NAN_DISCOVERY_RESULT
 		"subscribe_id=%d publish_id=%d address=" MACSTR
 		" fsd=%d fsd_gas=%d srv_proto_type=%u ssi=%s",
-		subscribe_id, peer_publish_id, MAC2STR(peer_addr),
-		fsd, fsd_gas, srv_proto_type, ssi_hex);
+		res->subscribe_id,
+		res->peer_publish_id,
+		MAC2STR(res->peer_addr),
+		res->fsd, res->fsd_gas,
+		res->srv_proto_type, ssi_hex);
 	os_free(ssi_hex);
 }
 
diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index f3a28b6e28..10ffcabce4 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -1404,6 +1404,8 @@ static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 			      bool range_limit, int rssi,
 			      const u8 *buf, size_t buf_len)
 {
+	struct nan_discovery_result res;
+
 	/* The SCIA can potentially contain a PMKID for each cipher suite */
 	u8 pmkid_list[(NAN_CS_MAX - 1) * PMKID_LEN];
 	size_t pmkid_count = 0;
@@ -1450,32 +1452,38 @@ static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 	}
 
 send_event:
-	/* Parse Cipher Suite Information Attribute for cipher suites */
+	os_memset(&res, 0, sizeof(res));
+
 	if (buf && buf_len > 0) {
+		/* Parse Cipher Suite Information Attribute */
 		cipher_suite_count =
 			nan_de_parse_csia(buf, buf_len, instance_id,
 					  cipher_suites,
-					  ARRAY_SIZE(cipher_suites), NULL);
-	}
-
-	/* Parse Security Context Information attribute for PMKIDs */
-	if (buf && buf_len > 0) {
-		pmkid_count = nan_de_parse_scia(buf, buf_len, instance_id,
-						pmkid_list,
-						sizeof(pmkid_list) / PMKID_LEN);
-	}
+					  ARRAY_SIZE(cipher_suites),
+					  NULL);
+
+		/* Parse Security Context Information attribute */
+		pmkid_count =
+			nan_de_parse_scia(buf, buf_len, instance_id,
+					  pmkid_list,
+					  sizeof(pmkid_list) / PMKID_LEN);
+	}
+
+	res.subscribe_id = srv->id;
+	res.srv_proto_type = srv_proto_type;
+	res.ssi = ssi;
+	res.ssi_len = ssi_len;
+	res.peer_publish_id = instance_id;
+	res.peer_addr = peer_addr;
+	res.fsd = !!(sdea_control & NAN_SDEA_CTRL_FSD_REQ);
+	res.fsd_gas = !!(sdea_control & NAN_SDEA_CTRL_FSD_GAS);
+	res.cipher_suites = cipher_suite_count > 0 ? cipher_suites : NULL;
+	res.n_cipher_suites = cipher_suite_count;
+	res.pmkid_list = pmkid_count > 0 ? pmkid_list : NULL;
+	res.pmkid_count = pmkid_count;
 
 	if (de->cb.discovery_result)
-		de->cb.discovery_result(
-			de->cb.ctx, srv->id, srv_proto_type,
-			ssi, ssi_len, instance_id,
-			peer_addr,
-			sdea_control & NAN_SDEA_CTRL_FSD_REQ,
-			sdea_control & NAN_SDEA_CTRL_FSD_GAS,
-			pmkid_count > 0 ? pmkid_list : NULL,
-			pmkid_count,
-			cipher_suite_count > 0 ? cipher_suites : NULL,
-			cipher_suite_count);
+		de->cb.discovery_result(de->cb.ctx, &res);
 
 	return true;
 }
diff --git a/src/common/nan_de.h b/src/common/nan_de.h
index 705ddc1836..cfba430bc6 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -24,6 +24,21 @@ enum nan_de_reason {
 	NAN_DE_REASON_FAILURE,
 };
 
+struct nan_discovery_result {
+	int subscribe_id;
+	enum nan_service_protocol_type srv_proto_type;
+	const u8 *ssi;
+	size_t ssi_len;
+	int peer_publish_id;
+	const u8 *peer_addr;
+	bool fsd;
+	bool fsd_gas;
+	const u8 *pmkid_list;
+	size_t pmkid_count;
+	const u8 *cipher_suites;
+	size_t n_cipher_suites;
+};
+
 struct nan_callbacks {
 	void *ctx;
 
@@ -33,15 +48,7 @@ struct nan_callbacks {
 	int (*listen)(void *ctx, unsigned int freq, unsigned int duration);
 
 	/* NAN DE Events */
-	void (*discovery_result)(void *ctx, int subscribe_id,
-				 enum nan_service_protocol_type srv_proto_type,
-				 const u8 *ssi, size_t ssi_len,
-				 int peer_publish_id,
-				 const u8 *peer_addr, bool fsd, bool fsd_gas,
-				 const u8 *pmkid_list, size_t pmkid_count,
-				 const u8 *cipher_suite,
-				 size_t n_cipher_suite);
-
+	void (*discovery_result)(void *ctx, struct nan_discovery_result *res);
 	void (*replied)(void *ctx, int publish_id, const u8 *peer_addr,
 			int peer_subscribe_id,
 			enum nan_service_protocol_type srv_proto_type,
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index ac8294d53e..ab9209e0f3 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -3348,21 +3348,11 @@ static int wpas_nan_de_listen(void *ctx, unsigned int freq,
 
 
 static void
-wpas_nan_de_discovery_result(void *ctx, int subscribe_id,
-			     enum nan_service_protocol_type srv_proto_type,
-			     const u8 *ssi, size_t ssi_len, int peer_publish_id,
-			     const u8 *peer_addr, bool fsd, bool fsd_gas,
-			     const u8 *pmkid_list, size_t pmkid_count,
-			     const u8 *cipher_suite,
-			     size_t n_cipher_suite)
+wpas_nan_de_discovery_result(void *ctx, struct nan_discovery_result *res)
 {
 	struct wpa_supplicant *wpa_s = ctx;
 
-	wpas_notify_nan_discovery_result(wpa_s, srv_proto_type, subscribe_id,
-					 peer_publish_id, peer_addr, fsd,
-					 fsd_gas, ssi, ssi_len,
-					 pmkid_list, pmkid_count,
-					 cipher_suite, n_cipher_suite);
+	wpas_notify_nan_discovery_result(wpa_s, res);
 }
 
 
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 8a0cabc052..d2b9c66c33 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1100,56 +1100,50 @@ void wpas_notify_hs20_t_c_acceptance(struct wpa_supplicant *wpa_s,
 #if defined(CONFIG_NAN) || defined(CONFIG_NAN_USD)
 
 void wpas_notify_nan_discovery_result(struct wpa_supplicant *wpa_s,
-				      enum nan_service_protocol_type
-				      srv_proto_type,
-				      int subscribe_id, int peer_publish_id,
-				      const u8 *peer_addr,
-				      bool fsd, bool fsd_gas,
-				      const u8 *ssi, size_t ssi_len,
-				      const u8 *pmkid_list, size_t pmkid_count,
-				      const u8 *cipher_suite_list,
-				      size_t cipher_suite_count)
+				      struct nan_discovery_result *res)
 {
 	char *ssi_hex, *pmkid_hex = NULL;
 	char *cipher_suites_str = NULL;
 	size_t i;
 	const size_t pmkid_hex_len = 2 * PMKID_LEN + 1;
 
-	ssi_hex = os_zalloc(2 * ssi_len + 1);
+	ssi_hex = os_zalloc(2 * res->ssi_len + 1);
 	if (!ssi_hex)
 		return;
-	if (ssi)
-		wpa_snprintf_hex(ssi_hex, 2 * ssi_len + 1, ssi, ssi_len);
+	if (res->ssi)
+		wpa_snprintf_hex(ssi_hex, 2 * res->ssi_len + 1,
+				 res->ssi, res->ssi_len);
 
-	if (pmkid_list && pmkid_count > 0) {
-		pmkid_hex = os_zalloc(pmkid_count * pmkid_hex_len);
+	if (res->pmkid_list && res->pmkid_count > 0) {
+		pmkid_hex =
+			os_zalloc(res->pmkid_count * pmkid_hex_len);
 		if (pmkid_hex) {
-			for (i = 0; i < pmkid_count; i++) {
+			for (i = 0; i < res->pmkid_count; i++) {
 				char *pos = &pmkid_hex[i * pmkid_hex_len];
 
 				wpa_snprintf_hex(pos, pmkid_hex_len,
-						 &pmkid_list[i * PMKID_LEN],
+						 &res->pmkid_list[i * PMKID_LEN],
 						 PMKID_LEN);
-				if (i < pmkid_count - 1)
+				if (i < res->pmkid_count - 1)
 					pos[2 * PMKID_LEN] = ',';
 			}
 		}
 	}
 
-	if (cipher_suite_list && cipher_suite_count > 0) {
+	if (res->cipher_suites && res->n_cipher_suites > 0) {
 		/* Allocate enough space for trailing space after each cipher */
-		cipher_suites_str = os_zalloc(cipher_suite_count * 2);
+		cipher_suites_str = os_zalloc(res->n_cipher_suites * 2);
 		if (cipher_suites_str) {
 			char *pos = cipher_suites_str;
 
-			for (i = 0; i < cipher_suite_count; i++) {
+			for (i = 0; i < res->n_cipher_suites; i++) {
 				int ret = os_snprintf(pos,
-						      cipher_suite_count * 2 - (pos - cipher_suites_str),
+						      res->n_cipher_suites * 2 - (pos - cipher_suites_str),
 						      "%s%u",
 						      i > 0 ? "," : "",
-						      cipher_suite_list[i]);
+						      res->cipher_suites[i]);
 
-				if (os_snprintf_error(cipher_suite_count * 2 - (pos - cipher_suites_str),
+				if (os_snprintf_error(res->n_cipher_suites * 2 - (pos - cipher_suites_str),
 						      ret))
 					break;
 				pos += ret;
@@ -1160,8 +1154,10 @@ void wpas_notify_nan_discovery_result(struct wpa_supplicant *wpa_s,
 	wpa_msg_global(wpa_s, MSG_INFO, NAN_DISCOVERY_RESULT
 		       "subscribe_id=%d publish_id=%d address=" MACSTR
 		       " fsd=%d fsd_gas=%d srv_proto_type=%u ssi=%s%s%s%s%s",
-		       subscribe_id, peer_publish_id, MAC2STR(peer_addr),
-		       fsd, fsd_gas, srv_proto_type, ssi_hex,
+		       res->subscribe_id,
+		       res->peer_publish_id,
+		       MAC2STR(res->peer_addr),
+		       res->fsd, res->fsd_gas, res->srv_proto_type, ssi_hex,
 		       pmkid_hex ? " pmkid=" : "",
 		       pmkid_hex ? pmkid_hex : "",
 		       cipher_suites_str ? " cipher_suites=" : "",
@@ -1170,10 +1166,13 @@ void wpas_notify_nan_discovery_result(struct wpa_supplicant *wpa_s,
 	os_free(pmkid_hex);
 	os_free(cipher_suites_str);
 
-	wpas_dbus_signal_nan_discovery_result(wpa_s, srv_proto_type,
-					      subscribe_id, peer_publish_id,
-					      peer_addr, fsd, fsd_gas,
-					      ssi, ssi_len);
+	wpas_dbus_signal_nan_discovery_result(wpa_s,
+					      res->srv_proto_type,
+					      res->subscribe_id,
+					      res->peer_publish_id,
+					      res->peer_addr,
+					      res->fsd, res->fsd_gas,
+					      res->ssi, res->ssi_len);
 }
 
 
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index 3d683c4219..8eb936a7dc 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -19,6 +19,7 @@ struct wpa_cred;
 struct rsn_pmksa_cache_entry;
 enum nan_de_reason;
 enum nan_service_protocol_type;
+struct nan_discovery_result;
 
 int wpas_notify_supplicant_initialized(struct wpa_global *global);
 void wpas_notify_supplicant_deinitialized(struct wpa_global *global);
@@ -185,15 +186,7 @@ void wpas_notify_signal_change(struct wpa_supplicant *wpa_s);
 void wpas_notify_hs20_t_c_acceptance(struct wpa_supplicant *wpa_s,
 				     const char *url);
 void wpas_notify_nan_discovery_result(struct wpa_supplicant *wpa_s,
-				      enum nan_service_protocol_type
-				      srv_proto_type,
-				      int subscribe_id, int peer_publish_id,
-				      const u8 *peer_addr,
-				      bool fsd, bool fsd_gas,
-				      const u8 *ssi, size_t ssi_len,
-				      const u8 *pmkid_list, size_t pmkid_count,
-				      const u8 *cipher_suite_list,
-				      size_t cipher_suite_count);
+				      struct nan_discovery_result *res);
 void wpas_notify_nan_replied(struct wpa_supplicant *wpa_s,
 			     enum nan_service_protocol_type srv_proto_type,
 			     int publish_id, int peer_subscribe_id,
-- 
2.53.0




More information about the Hostap mailing list