[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