[PATCH 79/92] wpa_supplicant: Support NAN pairing abort
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Apr 22 05:24:10 PDT 2026
NAN pairing doesn't have any internal timeouts/retries as in NAN
pairing it may take a significant amount of time for the responder to be
ready. Allow aborting (and restarting) NAN PASN pairing which may be
triggered by upper layers.
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
src/nan/nan.h | 1 +
src/nan/nan_pairing.c | 26 ++++++++++++++++++++++++++
wpa_supplicant/ctrl_iface.c | 3 +++
wpa_supplicant/nan_supplicant.c | 27 +++++++++++++++++++++++++++
wpa_supplicant/nan_supplicant.h | 1 +
wpa_supplicant/wpa_cli.c | 9 +++++++++
6 files changed, 67 insertions(+)
diff --git a/src/nan/nan.h b/src/nan/nan.h
index c1fe905b03..78111a3426 100644
--- a/src/nan/nan.h
+++ b/src/nan/nan.h
@@ -745,6 +745,7 @@ int nan_pairing_set_cipher_suites(struct nan_data *nan_data, u32 value);
int nan_pairing_set_nik(struct nan_data *nan, const u8 *nik, size_t nik_len);
int nan_pairing_set_nik_lifetime(struct nan_data *nan, u32 lifetime);
bool nan_pairing_is_peer_paired(struct nan_data *nan_data, const u8 *peer_addr);
+int nan_pairing_abort(struct nan_data *nan_data, const u8 *peer_addr);
#else
static inline int nan_pairing_add_attrs(struct nan_data *nan_data,
struct wpabuf *buf)
diff --git a/src/nan/nan_pairing.c b/src/nan/nan_pairing.c
index 05a40b9cd4..b468de3bb4 100644
--- a/src/nan/nan_pairing.c
+++ b/src/nan/nan_pairing.c
@@ -95,6 +95,32 @@ void nan_pairing_deinit_peer(struct nan_peer *peer)
}
+int nan_pairing_abort(struct nan_data *nan_data, const u8 *peer_addr)
+{
+ struct nan_peer *peer;
+
+ peer = nan_get_peer(nan_data, peer_addr);
+ if (!peer) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Pairing abort: Peer " MACSTR " not found",
+ MAC2STR(peer_addr));
+ return -1;
+ }
+
+ if (!peer->pairing.pasn) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Pairing abort: No PASN in progress with peer "
+ MACSTR, MAC2STR(peer_addr));
+ return -1;
+ }
+
+ wpa_printf(MSG_DEBUG, "NAN: Aborting pairing with peer " MACSTR,
+ MAC2STR(peer_addr));
+ nan_pairing_deinit_peer(peer);
+ return 0;
+}
+
+
static bool nan_pairing_is_supported(struct nan_data *nan_data,
struct nan_peer *peer, u8 auth_mode)
{
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 78a86f8c89..1096fa228d 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -14471,6 +14471,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
} else if (os_strncmp(buf, "NAN_PAIR ", 9) == 0) {
if (wpas_nan_pairing_start(wpa_s, buf + 9) < 0)
reply_len = -1;
+ } else if (os_strncmp(buf, "NAN_PAIR_ABORT ", 15) == 0) {
+ if (wpas_nan_pairing_abort(wpa_s, buf + 15) < 0)
+ reply_len = -1;
#endif /* CONFIG_PASN */
#endif /* CONFIG_NAN */
} else {
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index af1a21ce63..15db978f2f 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -2997,6 +2997,33 @@ int wpas_nan_pasn_auth_tx_status(struct wpa_supplicant *wpa_s, const u8 *data,
}
+int wpas_nan_pairing_abort(struct wpa_supplicant *wpa_s, const char *cmd)
+{
+ u8 addr[ETH_ALEN];
+ struct nan_data *nan = wpa_s->nan;
+
+ if (!nan) {
+ wpa_printf(MSG_DEBUG, "NAN_PAIR_ABORT: NAN not initialized");
+ return -1;
+ }
+
+ if (hwaddr_aton(cmd, addr)) {
+ wpa_printf(MSG_DEBUG,
+ "NAN_PAIR_ABORT: Invalid peer address: '%s'", cmd);
+ return -1;
+ }
+
+ if (nan_pairing_abort(nan, addr) < 0) {
+ wpa_printf(MSG_DEBUG,
+ "NAN_PAIR_ABORT: Abort failed for peer " MACSTR,
+ MAC2STR(addr));
+ return -1;
+ }
+
+ return 0;
+}
+
+
int wpas_nan_pasn_auth_rx(struct wpa_supplicant *wpa_s,
const struct ieee80211_mgmt *mgmt, size_t len)
{
diff --git a/wpa_supplicant/nan_supplicant.h b/wpa_supplicant/nan_supplicant.h
index 1e5196bca0..d018f3ac8f 100644
--- a/wpa_supplicant/nan_supplicant.h
+++ b/wpa_supplicant/nan_supplicant.h
@@ -41,6 +41,7 @@ int wpas_nan_pair(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
u8 auth_mode, int cipher, int handle, u8 peer_instance_id,
bool responder, const char *password);
int wpas_nan_pairing_start(struct wpa_supplicant *wpa_s, char *cmd);
+int wpas_nan_pairing_abort(struct wpa_supplicant *wpa_s, const char *cmd);
int wpas_nan_pasn_auth_tx_status(struct wpa_supplicant *wpa_s, const u8 *data,
size_t data_len, bool acked);
int wpas_nan_pasn_auth_rx(struct wpa_supplicant *wpa_s,
diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index aec6ac2099..bad4be030d 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -3475,6 +3475,12 @@ static int wpa_cli_cmd_nan_pair_start(struct wpa_ctrl *ctrl, int argc,
{
return wpa_cli_cmd(ctrl, "NAN_PAIR", 5, argc, argv);
}
+
+static int wpa_cli_cmd_nan_pair_abort(struct wpa_ctrl *ctrl, int argc,
+ char *argv[])
+{
+ return wpa_cli_cmd(ctrl, "NAN_PAIR_ABORT", 1, argc, argv);
+}
#endif /* CONFIG_PASN */
#endif /* CONFIG_NAN */
@@ -4292,6 +4298,9 @@ static const struct wpa_cli_cmd wpa_cli_commands[] = {
{ "nan_pair", wpa_cli_cmd_nan_pair_start, NULL,
cli_cmd_flag_none,
" = <peer_mac> <handle=<service handle>> <peer_instance_id=<peer requestor id>> <auth=<0|1|2>> <cipher=<CCMP|GCMP-256>> [password=<password>] [responder] = Request or authorize NAN pairing with peer" },
+ { "nan_pair_abort", wpa_cli_cmd_nan_pair_abort, NULL,
+ cli_cmd_flag_none,
+ " = <peer_mac> = Abort NAN pairing with peer" },
#endif /* CONFIG_PASN */
#endif /* CONFIG_NAN */
{ "new_random_mac_address", wpa_cli_cmd_generate_new_mac, NULL,
--
2.53.0
More information about the Hostap
mailing list