[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