[RFC v2 69/99] wpa_supplicant: Support NAN_NDP_TERMINATE command

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:52:13 PST 2025


Add support for NDP termination.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
 wpa_supplicant/ctrl_iface.c     |  3 ++
 wpa_supplicant/nan_supplicant.c | 75 +++++++++++++++++++++++++++++++++
 wpa_supplicant/nan_supplicant.h |  2 +-
 3 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 05debdb418..aed8f506dd 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -14356,6 +14356,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 	} else if (os_strncmp(buf, "NAN_NDP_RESPONSE ", 17) == 0) {
 		if (wpas_nan_ndp_response(wpa_s, buf + 17) < 0)
 			reply_len = -1;
+	} else if (os_strncmp(buf, "NAN_NDP_TERMINATE ", 17) == 0) {
+		if (wpas_nan_ndp_terminate(wpa_s, buf + 17) < 0)
+			reply_len = -1;
 #endif /* CONFIG_NAN */
 	} else {
 		os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 11f8844bac..19928c790e 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -1574,6 +1574,81 @@ fail:
 }
 
 
+/* Format: NAN_NDP_TERMINATE peer_nmi=<nmi> init_ndi=<ndi> ndp_id=<id> */
+int wpas_nan_ndp_terminate(struct wpa_supplicant *wpa_s, char *cmd)
+{
+	struct nan_ndp_params ndp;
+	char *token, *context = NULL;
+	char *pos;
+
+	os_memset(&ndp, 0, sizeof(ndp));
+
+	if (!wpas_nan_ready(wpa_s))
+		return -1;
+
+	ndp.type = NAN_NDP_ACTION_TERM;
+
+	/* Parse command parameters */
+	while ((token = str_token(cmd, " ", &context))) {
+		pos = os_strchr(token, '=');
+		if (!pos) {
+			wpa_printf(MSG_DEBUG,
+				   "NAN: Invalid parameter format: %s",
+				   token);
+			return -1;
+		}
+		*pos++ = '\0';
+
+		if (os_strcmp(token, "peer_nmi") == 0) {
+			if (hwaddr_aton(pos, ndp.ndp_id.peer_nmi) < 0) {
+				wpa_printf(MSG_DEBUG,
+					   "NAN: Invalid peer NMI address: %s",
+					   pos);
+				return -1;
+			}
+		} else if (os_strcmp(token, "init_ndi") == 0) {
+			if (hwaddr_aton(pos, ndp.ndp_id.init_ndi) < 0) {
+				wpa_printf(MSG_DEBUG,
+					   "NAN: Invalid initiator NDI address: %s",
+					   pos);
+				return -1;
+			}
+		} else if (os_strcmp(token, "ndp_id") == 0) {
+			ndp.ndp_id.id = atoi(pos);
+		} else {
+			wpa_printf(MSG_DEBUG, "NAN: Unknown parameter: %s",
+				   token);
+		}
+	}
+
+	/* Validate required parameters */
+	if (is_zero_ether_addr(ndp.ndp_id.peer_nmi)) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Missing required parameter: peer_nmi");
+		return -1;
+	}
+
+	if (is_zero_ether_addr(ndp.ndp_id.init_ndi)) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Missing required parameter: init_ndi");
+		return -1;
+	}
+
+	if (!ndp.ndp_id.id) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Missing required parameter: ndp_id");
+		return -1;
+	}
+
+	wpa_printf(MSG_DEBUG, "NAN: Terminating NDP with peer " MACSTR
+		   " init_ndi=" MACSTR " ndp_id=%u",
+		   MAC2STR(ndp.ndp_id.peer_nmi),
+		   MAC2STR(ndp.ndp_id.init_ndi), ndp.ndp_id.id);
+
+	return nan_handle_ndp_setup(wpa_s->nan, &ndp);
+}
+
+
 void wpas_nan_cluster_join(struct wpa_supplicant *wpa_s,
 			   const u8 *cluster_id,
 			   bool new_cluster)
diff --git a/wpa_supplicant/nan_supplicant.h b/wpa_supplicant/nan_supplicant.h
index 61a0a5c4d5..dbec989c19 100644
--- a/wpa_supplicant/nan_supplicant.h
+++ b/wpa_supplicant/nan_supplicant.h
@@ -29,7 +29,7 @@ int wpas_nan_ndp_request(struct wpa_supplicant *wpa_s, char *cmd);
 void wpas_nan_rx_naf(struct wpa_supplicant *wpa_s,
 		     const struct ieee80211_mgmt *mgmt, size_t len);
 int wpas_nan_ndp_response(struct wpa_supplicant *wpa_s, char *cmd);
-
+int wpas_nan_ndp_terminate(struct wpa_supplicant *wpa_s, char *cmd);
 #else /* CONFIG_NAN */
 
 static inline int wpas_nan_init(struct wpa_supplicant *wpa_s)
-- 
2.49.0




More information about the Hostap mailing list