[PATCH 74/92] wpa_supplicant: Do not enable Pairing and NDP if not supported by the driver
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Apr 22 05:24:05 PDT 2026
From: Ilan Peer <ilan.peer at intel.com>
If NAN Data Path is not supported by the driver do not configure
Pairing and NAN Data Path operation and fail all requests.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
wpa_supplicant/nan_supplicant.c | 101 +++++++++++++++++++-------------
1 file changed, 59 insertions(+), 42 deletions(-)
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 072ce8229f..404e28e74d 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -1061,26 +1061,40 @@ int wpas_nan_init(struct wpa_supplicant *wpa_s)
nan.start = wpas_nan_start_cb;
nan.stop = wpas_nan_stop_cb;
nan.update_config = wpas_nan_update_config_cb;
+
+ /* NDP and Bootstrapping enabled */
+ if (wpa_s->nan_capa.drv_flags & WPA_DRIVER_FLAGS_NAN_SUPPORT_NDP) {
#ifdef CONFIG_PASN
- nan.send_pasn = wpas_nan_pasn_send_cb;
- nan.pairing_result_cb = wpas_nan_pasn_auth_status_cb;
- nan.update_pairing_credentials = wpas_nan_update_pairing_credentials_cb;
- nan.get_npk_akmp = wpas_nan_get_npk_akmp_cb;
- nan.pairing_cfg.pairing_setup = true;
- nan.pairing_cfg.npk_caching = true;
- nan.pairing_cfg.pairing_verification = true;
- nan.pairing_cfg.cipher_suites = NAN_PAIRING_PASN_128 |
- NAN_PAIRING_PASN_256;
+ wpa_printf(MSG_DEBUG, "NAN: Pairing support enabled");
+ nan.send_pasn = wpas_nan_pasn_send_cb;
+ nan.pairing_result_cb = wpas_nan_pasn_auth_status_cb;
+ nan.update_pairing_credentials =
+ wpas_nan_update_pairing_credentials_cb;
+ nan.get_npk_akmp = wpas_nan_get_npk_akmp_cb;
+ nan.pairing_cfg.pairing_setup = true;
+ nan.pairing_cfg.npk_caching = true;
+ nan.pairing_cfg.pairing_verification = true;
+ nan.pairing_cfg.cipher_suites = NAN_PAIRING_PASN_128 |
+ NAN_PAIRING_PASN_256;
#endif /* CONFIG_PASN */
- /* NDP */
- nan.ndp_action_notif = wpas_nan_ndp_action_notif_cb;
- nan.ndp_connected = wpas_nan_ndp_connected_cb;
- nan.ndp_disconnected = wpas_nan_ndp_disconnected_cb;
- nan.send_naf = wpas_nan_send_naf_cb;
- nan.get_chans = wpas_nan_get_chans_cb;
- nan.is_valid_publish_id = wpas_nan_is_valid_publish_id_cb;
- nan.set_peer_schedule = wpas_nan_set_peer_schedule_cb;
+ wpa_printf(MSG_DEBUG, "NAN: NDP support enabled");
+
+ nan.ndp_action_notif = wpas_nan_ndp_action_notif_cb;
+ nan.ndp_connected = wpas_nan_ndp_connected_cb;
+ nan.ndp_disconnected = wpas_nan_ndp_disconnected_cb;
+ nan.send_naf = wpas_nan_send_naf_cb;
+ nan.get_chans = wpas_nan_get_chans_cb;
+ nan.is_valid_publish_id = wpas_nan_is_valid_publish_id_cb;
+ nan.set_peer_schedule = wpas_nan_set_peer_schedule_cb;
+
+ wpa_printf(MSG_DEBUG, "NAN: Bootstrap support enabled");
+ nan.bootstrap_request = wpas_nan_bootstrap_request_cb;
+ nan.bootstrap_completed = wpas_nan_bootstrap_completed_cb;
+ nan.transmit_followup = wpas_nan_transmit_followup_cb;
+ nan.get_supported_bootstrap_methods =
+ wpas_nan_get_service_bootstrap_methods;
+ }
/*
* TODO: Set the device capabilities based on configuration and driver
@@ -1102,11 +1116,6 @@ int wpas_nan_init(struct wpa_supplicant *wpa_s)
nan.dev_capa.channel_switch_time =
wpa_s->nan_capa.max_channel_switch_time;
nan.dev_capa.capa = wpa_s->nan_capa.dev_capa;
- nan.bootstrap_request = wpas_nan_bootstrap_request_cb;
- nan.bootstrap_completed = wpas_nan_bootstrap_completed_cb;
- nan.transmit_followup = wpas_nan_transmit_followup_cb;
- nan.get_supported_bootstrap_methods =
- wpas_nan_get_service_bootstrap_methods;
nan.supported_bootstrap_methods = DEFAULT_NAN_SUPP_PBM;
nan.auto_accept_bootstrap_methods = DEFAULT_NAN_AUTO_ACCEPT_PBM;
@@ -1187,13 +1196,23 @@ void wpas_nan_deinit(struct wpa_supplicant *wpa_s)
}
-static int wpas_nan_ready(struct wpa_supplicant *wpa_s)
+static bool wpas_nan_ready(struct wpa_supplicant *wpa_s)
{
return wpa_s->nan_mgmt && wpa_s->nan && wpa_s->nan_de &&
wpa_s->wpa_state != WPA_INTERFACE_DISABLED;
}
+static bool wpas_nan_ndp_allowed(struct wpa_supplicant *wpa_s)
+{
+ if (!wpas_nan_ready(wpa_s))
+ return false;
+
+ return !!(wpa_s->nan_capa.drv_flags &
+ WPA_DRIVER_FLAGS_NAN_SUPPORT_NDP);
+}
+
+
/* Join a cluster using current configuration */
int wpas_nan_start(struct wpa_supplicant *wpa_s)
{
@@ -1546,7 +1565,7 @@ int wpas_nan_sched_config_map(struct wpa_supplicant *wpa_s, const char *cmd)
struct bitfield *bf_total;
unsigned int expected_bitmap_len;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
if (os_strncmp(cmd, "map_id=", 7) != 0) {
@@ -2148,7 +2167,7 @@ int wpas_nan_ndp_request(struct wpa_supplicant *wpa_s, char *cmd)
os_memset(&ndp, 0, sizeof(ndp));
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
ndp.type = NAN_NDP_ACTION_REQ;
@@ -2310,7 +2329,7 @@ int wpas_nan_ndp_response(struct wpa_supplicant *wpa_s, char *cmd)
int handle = -1;
int ret = -1;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
os_memset(&ndp, 0, sizeof(ndp));
@@ -2505,7 +2524,7 @@ int wpas_nan_ndp_terminate(struct wpa_supplicant *wpa_s, char *cmd)
char *token, *context = NULL;
char *pos;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
os_memset(&ndp, 0, sizeof(ndp));
@@ -2690,7 +2709,7 @@ int wpas_nan_bootstrap_request(struct wpa_supplicant *wpa_s, char *cmd)
u16 bootstrap_method = 0;
bool auth = false;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
/* Parse peer address first */
@@ -2753,7 +2772,7 @@ int wpas_nan_bootstrap_reset(struct wpa_supplicant *wpa_s, char *cmd)
{
u8 peer_nmi[ETH_ALEN];
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
if (hwaddr_aton(cmd, peer_nmi) < 0)
@@ -2769,17 +2788,15 @@ static void wpas_nan_de_add_extra_attrs(void *ctx, struct wpabuf *buf)
struct nan_schedule sched;
u32 map_ids = (BIT(wpa_s->nan_capa.num_radios) - 1) << 1;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s) || !map_ids)
return;
- if (map_ids) {
- wpas_nan_fill_ndp_schedule(wpa_s, &sched);
- nan_add_dev_capa_attr(wpa_s->nan, buf);
- nan_convert_sched_to_avail_attrs(wpa_s->nan,
- wpa_s->schedule_sequence_id,
- map_ids, sched.n_chans,
- sched.chans, buf, true);
- }
+ wpas_nan_fill_ndp_schedule(wpa_s, &sched);
+ nan_add_dev_capa_attr(wpa_s->nan, buf);
+ nan_convert_sched_to_avail_attrs(wpa_s->nan,
+ wpa_s->schedule_sequence_id,
+ map_ids, sched.n_chans,
+ sched.chans, buf, true);
nan_pairing_add_attrs(wpa_s->nan, buf);
}
@@ -2852,7 +2869,7 @@ int wpas_nan_pair(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
int ret;
struct nan_schedule sched;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
wpas_nan_fill_ndp_schedule(wpa_s, &sched);
@@ -2973,7 +2990,7 @@ int wpas_nan_pasn_auth_rx(struct wpa_supplicant *wpa_s,
{
struct nan_data *nan = wpa_s->nan;
- if (!nan || !wpas_nan_ready(wpa_s))
+ if (!nan || !wpas_nan_ndp_allowed(wpa_s))
return -1;
return nan_pairing_auth_rx(nan, mgmt, len);
@@ -3838,7 +3855,7 @@ int wpas_nan_tx_status(struct wpa_supplicant *wpa_s,
const struct ieee80211_mgmt *mgmt =
(const struct ieee80211_mgmt *) data;
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
wpa_printf(MSG_DEBUG, "NAN: TX status for frame len=%zu acked=%u",
@@ -3858,7 +3875,7 @@ int wpas_nan_tx_status(struct wpa_supplicant *wpa_s,
void wpas_nan_rx_naf(struct wpa_supplicant *wpa_s,
const struct ieee80211_mgmt *mgmt, size_t len)
{
- if (!wpas_nan_ready(wpa_s))
+ if (!wpas_nan_ndp_allowed(wpa_s))
return;
nan_action_rx(wpa_s->nan, mgmt, len);
--
2.53.0
More information about the Hostap
mailing list