[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