[PATCH V3 01/20] NAN: Combine nan_usd.c/h with nan_supplicant.c/h files

Andrei Otcheretianski andrei.otcheretianski at intel.com
Thu Feb 5 07:11:58 PST 2026


Move the NAN USD code from nan_usd.c/h into nan_supplicant.c/h files.
The USD-specific code is guarded with CONFIG_NAN_USD, while common
code that can be used by both USD and synchronized NAN is shared.

Update Makefile to build nan_supplicant.o when either CONFIG_NAN or
CONFIG_NAN_USD is defined.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
 wpa_supplicant/Android.mk               |  14 +-
 wpa_supplicant/Makefile                 |  12 +-
 wpa_supplicant/ctrl_iface.c             |   1 -
 wpa_supplicant/dbus/dbus_new_handlers.c |   2 +-
 wpa_supplicant/events.c                 |   1 -
 wpa_supplicant/nan_supplicant.c         | 710 +++++++++++++++++++++++
 wpa_supplicant/nan_supplicant.h         |  47 ++
 wpa_supplicant/nan_usd.c                | 716 ------------------------
 wpa_supplicant/nan_usd.h                |  54 --
 wpa_supplicant/p2p_supplicant.c         |   2 +-
 wpa_supplicant/wpa_supplicant.c         |   1 -
 11 files changed, 776 insertions(+), 784 deletions(-)
 delete mode 100644 wpa_supplicant/nan_usd.c
 delete mode 100644 wpa_supplicant/nan_usd.h

diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk
index 7f92712608..4efa8a4686 100644
--- a/wpa_supplicant/Android.mk
+++ b/wpa_supplicant/Android.mk
@@ -284,15 +284,13 @@ endif
 endif
 
 ifdef CONFIG_NAN
-OBJS += nan_supplicant.c
-OBJS += src/nan/nan.c
-CFLAGS += -DCONFIG_NAN
+NEED_NAN=y
+L_CFLAGS += -DCONFIG_NAN
 endif
 
 ifdef CONFIG_NAN_USD
-OBJS += src/common/nan_de.c
-OBJS += nan_usd.c
 NEED_OFFCHANNEL=y
+NEED_NAN=y
 L_CFLAGS += -DCONFIG_NAN_USD
 endif
 
@@ -302,6 +300,12 @@ OBJS += pr_supplicant.c
 L_CFLAGS += -DCONFIG_PR
 endif
 
+ifdef NEED_NAN
+OBJS += nan_supplicant.c
+OBJS += src/nan/nan.c
+OBJS += src/common/nan_de.c
+endif
+
 ifdef CONFIG_OWE
 L_CFLAGS += -DCONFIG_OWE
 NEED_ECC=y
diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile
index 9c7658c7a5..ba712f02e6 100644
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -318,18 +318,22 @@ endif
 endif
 
 ifdef CONFIG_NAN
-OBJS += nan_supplicant.o
-OBJS += ../src/nan/nan.o
+NEED_NAN=y
 CFLAGS += -DCONFIG_NAN
 endif
 
 ifdef CONFIG_NAN_USD
-OBJS += ../src/common/nan_de.o
-OBJS += nan_usd.o
 NEED_OFFCHANNEL=y
+NEED_NAN=y
 CFLAGS += -DCONFIG_NAN_USD
 endif
 
+ifdef NEED_NAN
+OBJS += nan_supplicant.o
+OBJS += ../src/nan/nan.o
+OBJS += ../src/common/nan_de.o
+endif
+
 ifdef CONFIG_PR
 OBJS += ../src/common/proximity_ranging.o
 OBJS += pr_supplicant.o
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 1c1298d956..d918205d51 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -61,7 +61,6 @@
 #include "mesh.h"
 #include "dpp_supplicant.h"
 #include "sme.h"
-#include "nan_usd.h"
 #include "pr_supplicant.h"
 #include "nan_supplicant.h"
 
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
index 76a9297eba..2e5f7d2641 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers.c
@@ -28,7 +28,7 @@
 #include "../autoscan.h"
 #include "../ap.h"
 #include "../interworking.h"
-#include "../nan_usd.h"
+#include "../nan_supplicant.h"
 #include "dbus_new_helpers.h"
 #include "dbus_new.h"
 #include "dbus_new_handlers.h"
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index ea36493feb..b3e3414651 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -51,7 +51,6 @@
 #include "mesh.h"
 #include "mesh_mpm.h"
 #include "wmm_ac.h"
-#include "nan_usd.h"
 #include "dpp_supplicant.h"
 #include "pr_supplicant.h"
 #include "nan_supplicant.h"
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index b053225fc2..999ec79ec4 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -1,5 +1,6 @@
 /*
  * wpa_supplicant - NAN
+ * Copyright (c) 2024, Qualcomm Innovation Center, Inc.
  * Copyright (C) 2025 Intel Corporation
  *
  * This software may be distributed under the terms of the BSD license.
@@ -13,10 +14,18 @@
 #include "driver_i.h"
 #include "nan/nan.h"
 #include "config.h"
+#include "common/nan_de.h"
+#include "offchannel.h"
+#include "notify.h"
+#include "p2p_supplicant.h"
+#include "pr_supplicant.h"
+#include "nan_supplicant.h"
+#include "utils/eloop.h"
 
 #define DEFAULT_NAN_MASTER_PREF 2
 #define DEFAULT_NAN_DUAL_BAND   0
 
+#ifdef CONFIG_NAN
 
 static int wpas_nan_start_cb(void *ctx, struct nan_cluster_config *config)
 {
@@ -143,3 +152,704 @@ void wpas_nan_next_dw(struct wpa_supplicant *wpa_s, u32 freq)
 	wpa_printf(MSG_DEBUG, "NAN: Next DW notification freq=%d", freq);
 	nan_de_dw_trigger(wpa_s->nan_de, freq);
 }
+
+#endif /* CONFIG_NAN */
+
+#ifdef CONFIG_NAN_USD
+
+static const char *
+tx_status_result_txt(enum offchannel_send_action_result result)
+{
+	switch (result) {
+	case OFFCHANNEL_SEND_ACTION_SUCCESS:
+		return "success";
+	case OFFCHANNEL_SEND_ACTION_NO_ACK:
+		return "no-ack";
+	case OFFCHANNEL_SEND_ACTION_FAILED:
+		return "failed";
+	}
+
+	return "?";
+}
+
+
+static void wpas_nan_de_tx_status(struct wpa_supplicant *wpa_s,
+				  unsigned int freq, const u8 *dst,
+				  const u8 *src, const u8 *bssid,
+				  const u8 *data, size_t data_len,
+				  enum offchannel_send_action_result result)
+{
+	if (!wpa_s->nan_de)
+		return;
+
+	wpa_printf(MSG_DEBUG, "NAN: TX status A1=" MACSTR " A2=" MACSTR
+		   " A3=" MACSTR " freq=%d len=%zu result=%s",
+		   MAC2STR(dst), MAC2STR(src), MAC2STR(bssid), freq,
+		   data_len, tx_status_result_txt(result));
+
+	nan_de_tx_status(wpa_s->nan_de, freq, dst);
+}
+
+
+struct wpas_nan_usd_tx_work {
+	unsigned int freq;
+	unsigned int wait_time;
+	u8 dst[ETH_ALEN];
+	u8 src[ETH_ALEN];
+	u8 bssid[ETH_ALEN];
+	struct wpabuf *buf;
+};
+
+
+static void wpas_nan_usd_tx_work_free(struct wpas_nan_usd_tx_work *twork)
+{
+	if (!twork)
+		return;
+	wpabuf_free(twork->buf);
+	os_free(twork);
+}
+
+
+static void wpas_nan_usd_tx_work_done(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_nan_usd_tx_work *twork;
+
+	if (!wpa_s->nan_usd_tx_work)
+		return;
+
+	twork = wpa_s->nan_usd_tx_work->ctx;
+	wpas_nan_usd_tx_work_free(twork);
+	radio_work_done(wpa_s->nan_usd_tx_work);
+	wpa_s->nan_usd_tx_work = NULL;
+}
+
+
+static int wpas_nan_de_tx_send(struct wpa_supplicant *wpa_s, unsigned int freq,
+			       unsigned int wait_time, const u8 *dst,
+			       const u8 *src, const u8 *bssid,
+			       const struct wpabuf *buf)
+{
+	wpa_printf(MSG_DEBUG, "NAN: TX NAN SDF A1=" MACSTR " A2=" MACSTR
+		   " A3=" MACSTR " freq=%d len=%zu",
+		   MAC2STR(dst), MAC2STR(src), MAC2STR(bssid), freq,
+		   wpabuf_len(buf));
+
+	return offchannel_send_action(wpa_s, freq, dst, src, bssid,
+				      wpabuf_head(buf), wpabuf_len(buf),
+				      wait_time, wpas_nan_de_tx_status, 1);
+}
+
+
+static void wpas_nan_usd_start_tx_cb(struct wpa_radio_work *work, int deinit)
+{
+	struct wpa_supplicant *wpa_s = work->wpa_s;
+	struct wpas_nan_usd_tx_work *twork = work->ctx;
+
+	if (deinit) {
+		if (work->started) {
+			wpa_s->nan_usd_tx_work = NULL;
+			offchannel_send_action_done(wpa_s);
+		}
+		wpas_nan_usd_tx_work_free(twork);
+		return;
+	}
+
+	wpa_s->nan_usd_tx_work = work;
+
+	if (wpas_nan_de_tx_send(wpa_s, twork->freq, twork->wait_time,
+				twork->dst, twork->src, twork->bssid,
+				twork->buf) < 0)
+		wpas_nan_usd_tx_work_done(wpa_s);
+}
+
+
+static int wpas_nan_de_tx(void *ctx, unsigned int freq, unsigned int wait_time,
+			  const u8 *dst, const u8 *src, const u8 *bssid,
+			  const struct wpabuf *buf)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+	struct wpas_nan_usd_tx_work *twork;
+
+	if (wpa_s->nan_usd_tx_work || wpa_s->nan_usd_listen_work) {
+		/* Reuse ongoing radio work */
+		return wpas_nan_de_tx_send(wpa_s, freq, wait_time, dst, src,
+					   bssid, buf);
+	}
+
+	twork = os_zalloc(sizeof(*twork));
+	if (!twork)
+		return -1;
+	twork->freq = freq;
+	twork->wait_time = wait_time;
+	os_memcpy(twork->dst, dst, ETH_ALEN);
+	os_memcpy(twork->src, src, ETH_ALEN);
+	os_memcpy(twork->bssid, bssid, ETH_ALEN);
+	twork->buf = wpabuf_dup(buf);
+	if (!twork->buf) {
+		wpas_nan_usd_tx_work_free(twork);
+		return -1;
+	}
+
+	if (radio_add_work(wpa_s, freq, "nan-usd-tx", 0,
+			   wpas_nan_usd_start_tx_cb, twork) < 0) {
+		wpas_nan_usd_tx_work_free(twork);
+		return -1;
+	}
+
+	return 0;
+}
+
+
+struct wpas_nan_usd_listen_work {
+	unsigned int freq;
+	unsigned int duration;
+};
+
+
+static void wpas_nan_usd_listen_work_done(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_nan_usd_listen_work *lwork;
+
+	if (!wpa_s->nan_usd_listen_work)
+		return;
+
+	lwork = wpa_s->nan_usd_listen_work->ctx;
+	os_free(lwork);
+	radio_work_done(wpa_s->nan_usd_listen_work);
+	wpa_s->nan_usd_listen_work = NULL;
+}
+
+
+static void wpas_nan_usd_remain_on_channel_timeout(void *eloop_ctx,
+						   void *timeout_ctx)
+{
+	struct wpa_supplicant *wpa_s = eloop_ctx;
+	struct wpas_nan_usd_listen_work *lwork = timeout_ctx;
+
+	wpas_nan_usd_cancel_remain_on_channel_cb(wpa_s, lwork->freq);
+}
+
+
+static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
+					 int deinit)
+{
+	struct wpa_supplicant *wpa_s = work->wpa_s;
+	struct wpas_nan_usd_listen_work *lwork = work->ctx;
+	unsigned int duration;
+
+	if (deinit) {
+		if (work->started) {
+			wpa_s->nan_usd_listen_work = NULL;
+			wpa_drv_cancel_remain_on_channel(wpa_s);
+		}
+		os_free(lwork);
+		return;
+	}
+
+	wpa_s->nan_usd_listen_work = work;
+
+	duration = lwork->duration;
+	if (duration > wpa_s->max_remain_on_chan)
+		duration = wpa_s->max_remain_on_chan;
+	wpa_printf(MSG_DEBUG, "NAN: Start listen on %u MHz for %u ms",
+		   lwork->freq, duration);
+	if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration) < 0) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Failed to request the driver to remain on channel (%u MHz) for listen",
+			   lwork->freq);
+		eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout,
+				     wpa_s, ELOOP_ALL_CTX);
+		/* Restart the listen state after a delay */
+		eloop_register_timeout(0, 500,
+				       wpas_nan_usd_remain_on_channel_timeout,
+				       wpa_s, lwork);
+		wpas_nan_usd_listen_work_done(wpa_s);
+		return;
+	}
+}
+
+
+static int wpas_nan_de_listen(void *ctx, unsigned int freq,
+			      unsigned int duration)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+	struct wpas_nan_usd_listen_work *lwork;
+
+	lwork = os_zalloc(sizeof(*lwork));
+	if (!lwork)
+		return -1;
+	lwork->freq = freq;
+	lwork->duration = duration;
+
+	if (radio_add_work(wpa_s, freq, "nan-usd-listen", 0,
+			   wpas_nan_usd_start_listen_cb, lwork) < 0) {
+		os_free(lwork);
+		return -1;
+	}
+
+	return 0;
+}
+
+
+static void
+wpas_nan_de_discovery_result(void *ctx, int subscribe_id,
+			     enum nan_service_protocol_type srv_proto_type,
+			     const u8 *ssi, size_t ssi_len, int peer_publish_id,
+			     const u8 *peer_addr, bool fsd, bool fsd_gas)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_notify_nan_discovery_result(wpa_s, srv_proto_type, subscribe_id,
+					 peer_publish_id, peer_addr, fsd,
+					 fsd_gas, ssi, ssi_len);
+}
+
+
+static void wpas_nan_de_replied(void *ctx, int publish_id, const u8 *peer_addr,
+				int peer_subscribe_id,
+				enum nan_service_protocol_type srv_proto_type,
+				const u8 *ssi, size_t ssi_len)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_notify_nan_replied(wpa_s, srv_proto_type, publish_id,
+				peer_subscribe_id, peer_addr, ssi, ssi_len);
+}
+
+
+static void wpas_nan_de_publish_terminated(void *ctx, int publish_id,
+					   enum nan_de_reason reason)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_notify_nan_publish_terminated(wpa_s, publish_id, reason);
+}
+
+
+static void wpas_nan_usd_offload_cancel_publish(void *ctx, int publish_id)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		wpas_drv_nan_cancel_publish(wpa_s, publish_id);
+}
+
+
+static void wpas_nan_de_subscribe_terminated(void *ctx, int subscribe_id,
+					     enum nan_de_reason reason)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_notify_nan_subscribe_terminated(wpa_s, subscribe_id, reason);
+}
+
+
+static void wpas_nan_usd_offload_cancel_subscribe(void *ctx, int subscribe_id)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		wpas_drv_nan_cancel_subscribe(wpa_s, subscribe_id);
+}
+
+
+static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id,
+				const u8 *ssi, size_t ssi_len,
+				const u8 *peer_addr)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
+				ssi, ssi_len);
+}
+
+
+#ifdef CONFIG_P2P
+static void wpas_nan_process_p2p_usd_elems(void *ctx, const u8 *buf,
+					   u16 buf_len, const u8 *peer_addr,
+					   unsigned int freq)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_p2p_process_usd_elems(wpa_s, buf, buf_len, peer_addr, freq);
+}
+#endif /* CONFIG_P2P */
+
+
+#ifdef CONFIG_PR
+static void wpas_nan_process_pr_usd_elems(void *ctx, const u8 *buf, u16 buf_len,
+					  const u8 *peer_addr,
+					  unsigned int freq)
+{
+	struct wpa_supplicant *wpa_s = ctx;
+
+	wpas_pr_process_usd_elems(wpa_s, buf, buf_len, peer_addr, freq);
+}
+#endif /* CONFIG_PR */
+
+
+int wpas_nan_usd_init(struct wpa_supplicant *wpa_s)
+{
+	struct nan_callbacks cb;
+	bool offload = !!(wpa_s->drv_flags2 &
+			  WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD);
+
+	os_memset(&cb, 0, sizeof(cb));
+	cb.ctx = wpa_s;
+	cb.tx = wpas_nan_de_tx;
+	cb.listen = wpas_nan_de_listen;
+	cb.discovery_result = wpas_nan_de_discovery_result;
+	cb.replied = wpas_nan_de_replied;
+	cb.publish_terminated = wpas_nan_de_publish_terminated;
+	cb.subscribe_terminated = wpas_nan_de_subscribe_terminated;
+	cb.offload_cancel_publish = wpas_nan_usd_offload_cancel_publish;
+	cb.offload_cancel_subscribe = wpas_nan_usd_offload_cancel_subscribe;
+	cb.receive = wpas_nan_de_receive;
+#ifdef CONFIG_P2P
+	cb.process_p2p_usd_elems = wpas_nan_process_p2p_usd_elems;
+#endif /* CONFIG_P2P */
+#ifdef CONFIG_PR
+	cb.process_pr_usd_elems = wpas_nan_process_pr_usd_elems;
+#endif /* CONFIG_PR */
+
+	wpa_s->nan_de = nan_de_init(wpa_s->own_addr, offload, false,
+				    wpa_s->max_remain_on_chan, &cb);
+	if (!wpa_s->nan_de)
+		return -1;
+	return 0;
+}
+
+
+void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s)
+{
+	eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout,
+			     wpa_s, ELOOP_ALL_CTX);
+	nan_de_deinit(wpa_s->nan_de);
+	wpa_s->nan_de = NULL;
+}
+
+
+void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
+			 const u8 *a3,
+			 unsigned int freq, const u8 *buf, size_t len)
+{
+	if (!wpa_s->nan_de)
+		return;
+	nan_de_rx_sdf(wpa_s->nan_de, src, a3, freq, buf, len);
+}
+
+
+void wpas_nan_usd_flush(struct wpa_supplicant *wpa_s)
+{
+	if (!wpa_s->nan_de)
+		return;
+	nan_de_flush(wpa_s->nan_de);
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		wpas_drv_nan_flush(wpa_s);
+}
+
+
+int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name,
+			 enum nan_service_protocol_type srv_proto_type,
+			 const struct wpabuf *ssi,
+			 struct nan_publish_params *params, bool p2p)
+{
+	int publish_id;
+	struct wpabuf *elems = NULL;
+	const u8 *addr;
+
+	if (!wpa_s->nan_de)
+		return -1;
+
+	if (params->proximity_ranging && !params->solicited) {
+		wpa_printf(MSG_INFO,
+			   "PR unsolicited publish service discovery not allowed");
+		return -1;
+	}
+
+	addr = wpa_s->own_addr;
+
+	if (p2p) {
+		elems = wpas_p2p_usd_elems(wpa_s, service_name);
+		addr = wpa_s->global->p2p_dev_addr;
+	} else if (params->proximity_ranging) {
+		elems = wpas_pr_usd_elems(wpa_s);
+	}
+
+	publish_id = nan_de_publish(wpa_s->nan_de, service_name, srv_proto_type,
+				    ssi, elems, params, p2p);
+	if (publish_id >= 1 &&
+	    (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
+	    wpas_drv_nan_publish(wpa_s, addr, publish_id, service_name,
+				 nan_de_get_service_id(wpa_s->nan_de,
+						       publish_id),
+				 srv_proto_type, ssi, elems, params) < 0) {
+		nan_de_cancel_publish(wpa_s->nan_de, publish_id);
+		publish_id = -1;
+	}
+
+	wpabuf_free(elems);
+	return publish_id;
+}
+
+
+void wpas_nan_usd_cancel_publish(struct wpa_supplicant *wpa_s, int publish_id)
+{
+	if (!wpa_s->nan_de)
+		return;
+	nan_de_cancel_publish(wpa_s->nan_de, publish_id);
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		wpas_drv_nan_cancel_publish(wpa_s, publish_id);
+}
+
+
+int wpas_nan_usd_update_publish(struct wpa_supplicant *wpa_s, int publish_id,
+				const struct wpabuf *ssi)
+{
+	int ret;
+
+	if (!wpa_s->nan_de)
+		return -1;
+	ret = nan_de_update_publish(wpa_s->nan_de, publish_id, ssi);
+	if (ret == 0 && (wpa_s->drv_flags2 &
+			 WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
+	    wpas_drv_nan_update_publish(wpa_s, publish_id, ssi) < 0)
+		return -1;
+	return ret;
+}
+
+
+int wpas_nan_usd_unpause_publish(struct wpa_supplicant *wpa_s, int publish_id,
+				 u8 peer_instance_id, const u8 *peer_addr)
+{
+	if (!wpa_s->nan_de)
+		return -1;
+	return nan_de_unpause_publish(wpa_s->nan_de, publish_id,
+				      peer_instance_id, peer_addr);
+}
+
+
+static int wpas_nan_stop_listen(struct wpa_supplicant *wpa_s, int id)
+{
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		return 0;
+
+	if (nan_de_stop_listen(wpa_s->nan_de, id) < 0)
+		return -1;
+
+	if (wpa_s->nan_usd_listen_work) {
+		wpa_printf(MSG_DEBUG, "NAN: Stop listen operation");
+		wpa_drv_cancel_remain_on_channel(wpa_s);
+		wpas_nan_usd_listen_work_done(wpa_s);
+	}
+
+	if (wpa_s->nan_usd_tx_work) {
+		wpa_printf(MSG_DEBUG, "NAN: Stop TX wait operation");
+		offchannel_send_action_done(wpa_s);
+		wpas_nan_usd_tx_work_done(wpa_s);
+	}
+
+	return 0;
+}
+
+
+int wpas_nan_usd_publish_stop_listen(struct wpa_supplicant *wpa_s,
+				     int publish_id)
+{
+	if (!wpa_s->nan_de)
+		return -1;
+
+	wpa_printf(MSG_DEBUG, "NAN: Request to stop listen for publish_id=%d",
+		   publish_id);
+	return wpas_nan_stop_listen(wpa_s, publish_id);
+}
+
+
+int wpas_nan_usd_subscribe(struct wpa_supplicant *wpa_s,
+			   const char *service_name,
+			   enum nan_service_protocol_type srv_proto_type,
+			   const struct wpabuf *ssi,
+			   struct nan_subscribe_params *params, bool p2p)
+{
+	int subscribe_id;
+	struct wpabuf *elems = NULL;
+	const u8 *addr;
+
+	if (!wpa_s->nan_de)
+		return -1;
+
+	if (params->proximity_ranging && !params->active) {
+		wpa_printf(MSG_INFO,
+			   "PR passive subscriber service discovery not allowed");
+		return -1;
+	}
+
+	addr = wpa_s->own_addr;
+
+	if (p2p) {
+		elems = wpas_p2p_usd_elems(wpa_s, service_name);
+		addr = wpa_s->global->p2p_dev_addr;
+	} else if (params->proximity_ranging) {
+		elems = wpas_pr_usd_elems(wpa_s);
+	}
+
+	subscribe_id = nan_de_subscribe(wpa_s->nan_de, service_name,
+					srv_proto_type, ssi, elems, params,
+					p2p);
+	if (subscribe_id >= 1 &&
+	    (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
+	    wpas_drv_nan_subscribe(wpa_s, addr, subscribe_id, service_name,
+				   nan_de_get_service_id(wpa_s->nan_de,
+							 subscribe_id),
+				   srv_proto_type, ssi, elems, params) < 0) {
+		nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id);
+		subscribe_id = -1;
+	}
+
+	wpabuf_free(elems);
+	return subscribe_id;
+}
+
+
+void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
+				   int subscribe_id)
+{
+	if (!wpa_s->nan_de)
+		return;
+	nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id);
+	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
+		wpas_drv_nan_cancel_subscribe(wpa_s, subscribe_id);
+}
+
+
+int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s,
+				       int subscribe_id)
+{
+	if (!wpa_s->nan_de)
+		return -1;
+
+	wpa_printf(MSG_DEBUG, "NAN: Request to stop listen for subscribe_id=%d",
+		   subscribe_id);
+	return wpas_nan_stop_listen(wpa_s, subscribe_id);
+}
+
+
+int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
+			  const struct wpabuf *ssi, const struct wpabuf *elems,
+			  const u8 *peer_addr, u8 req_instance_id)
+{
+	if (!wpa_s->nan_de)
+		return -1;
+	return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
+			       req_instance_id);
+}
+
+
+void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
+				       unsigned int freq, unsigned int duration)
+{
+	wpas_nan_usd_listen_work_done(wpa_s);
+
+	if (wpa_s->nan_de)
+		nan_de_listen_started(wpa_s->nan_de, freq, duration);
+}
+
+
+void wpas_nan_usd_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
+					      unsigned int freq)
+{
+	if (wpa_s->nan_de)
+		nan_de_listen_ended(wpa_s->nan_de, freq);
+}
+
+
+void wpas_nan_usd_tx_wait_expire(struct wpa_supplicant *wpa_s)
+{
+	wpas_nan_usd_tx_work_done(wpa_s);
+
+	if (wpa_s->nan_de)
+		nan_de_tx_wait_ended(wpa_s->nan_de);
+}
+
+
+int * wpas_nan_usd_all_freqs(struct wpa_supplicant *wpa_s)
+{
+	int i, j;
+	int *freqs = NULL;
+
+	if (!wpa_s->hw.modes)
+		return NULL;
+
+	for (i = 0; i < wpa_s->hw.num_modes; i++) {
+		struct hostapd_hw_modes *mode = &wpa_s->hw.modes[i];
+
+		for (j = 0; j < mode->num_channels; j++) {
+			struct hostapd_channel_data *chan = &mode->channels[j];
+
+			/* All 20 MHz channels on 2.4 and 5 GHz band */
+			if (chan->freq < 2412 || chan->freq > 5900)
+				continue;
+
+			/* that allow frames to be transmitted */
+			if (chan->flag & (HOSTAPD_CHAN_DISABLED |
+					  HOSTAPD_CHAN_NO_IR |
+					  HOSTAPD_CHAN_RADAR))
+				continue;
+
+			int_array_add_unique(&freqs, chan->freq);
+		}
+	}
+
+	return freqs;
+}
+
+
+void wpas_nan_usd_state_change_notif(struct wpa_supplicant *wpa_s)
+{
+	struct wpa_supplicant *ifs;
+	unsigned int n_active = 0;
+	struct nan_de_cfg cfg;
+
+	if (!wpa_s->radio)
+		return;
+
+	os_memset(&cfg, 0, sizeof(cfg));
+
+	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
+			 radio_list) {
+		if (ifs->wpa_state >= WPA_AUTHENTICATING)
+			n_active++;
+	}
+
+	wpa_printf(MSG_DEBUG,
+		   "NAN: state change notif: n_active=%u, p2p_in_progress=%u",
+		   n_active, wpas_p2p_in_progress(wpa_s));
+
+	if (n_active) {
+		cfg.n_max = 3;
+
+		if (!wpas_p2p_in_progress(wpa_s)) {
+			/* Limit the USD operation on channel to 100 - 300 TUs
+			 * to allow more time for other interfaces.
+			 */
+			cfg.n_min = 1;
+		} else {
+			/* Limit the USD operation on channel to 200 - 300 TUs
+			 * to allow P2P operation to complete.
+			 */
+			cfg.n_min = 2;
+		}
+
+		/* Each 500 ms suspend USD operation for 300 ms */
+		cfg.cycle = 500;
+		cfg.suspend = 300;
+	}
+
+	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
+			 radio_list) {
+		if (ifs->nan_de)
+			nan_de_config(ifs->nan_de, &cfg);
+	}
+}
+
+#endif /* CONFIG_NAN_USD */
diff --git a/wpa_supplicant/nan_supplicant.h b/wpa_supplicant/nan_supplicant.h
index 2c2d7ff7aa..37d6a710c4 100644
--- a/wpa_supplicant/nan_supplicant.h
+++ b/wpa_supplicant/nan_supplicant.h
@@ -1,5 +1,6 @@
 /*
  * wpa_supplicant - NAN
+ * Copyright (c) 2024, Qualcomm Innovation Center, Inc.
  * Copyright (C) 2025 Intel Corporation
  *
  * This software may be distributed under the terms of the BSD license.
@@ -46,4 +47,50 @@ static inline void wpas_nan_flush(struct wpa_supplicant *wpa_s)
 
 #endif /* CONFIG_NAN */
 
+#ifdef CONFIG_NAN_USD
+
+struct nan_subscribe_params;
+struct nan_publish_params;
+enum nan_service_protocol_type;
+
+int wpas_nan_usd_init(struct wpa_supplicant *wpa_s);
+void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s);
+void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
+			 const u8 *a3,
+			 unsigned int freq, const u8 *buf, size_t len);
+void wpas_nan_usd_flush(struct wpa_supplicant *wpa_s);
+int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name,
+			 enum nan_service_protocol_type srv_proto_type,
+			 const struct wpabuf *ssi,
+			 struct nan_publish_params *params, bool p2p);
+void wpas_nan_usd_cancel_publish(struct wpa_supplicant *wpa_s, int publish_id);
+int wpas_nan_usd_update_publish(struct wpa_supplicant *wpa_s, int publish_id,
+				const struct wpabuf *ssi);
+int wpas_nan_usd_unpause_publish(struct wpa_supplicant *wpa_s, int publish_id,
+				 u8 peer_instance_id, const u8 *peer_addr);
+int wpas_nan_usd_publish_stop_listen(struct wpa_supplicant *wpa_s,
+				     int publish_id);
+int wpas_nan_usd_subscribe(struct wpa_supplicant *wpa_s,
+			   const char *service_name,
+			   enum nan_service_protocol_type srv_proto_type,
+			   const struct wpabuf *ssi,
+			   struct nan_subscribe_params *params, bool p2p);
+void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
+				   int subscribe_id);
+int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s,
+				       int subscribe_id);
+int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
+			  const struct wpabuf *ssi, const struct wpabuf *elems,
+			  const u8 *peer_addr, u8 req_instance_id);
+void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
+				       unsigned int freq,
+				       unsigned int duration);
+void wpas_nan_usd_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
+					      unsigned int freq);
+void wpas_nan_usd_tx_wait_expire(struct wpa_supplicant *wpa_s);
+int * wpas_nan_usd_all_freqs(struct wpa_supplicant *wpa_s);
+void wpas_nan_usd_state_change_notif(struct wpa_supplicant *wpa_s);
+
+#endif /* CONFIG_NAN_USD */
+
 #endif /* NAN_SUPPLICANT_H */
diff --git a/wpa_supplicant/nan_usd.c b/wpa_supplicant/nan_usd.c
deleted file mode 100644
index e4c448f6bd..0000000000
--- a/wpa_supplicant/nan_usd.c
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- * NAN unsynchronized service discovery (USD)
- * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/nan_de.h"
-#include "wpa_supplicant_i.h"
-#include "offchannel.h"
-#include "driver_i.h"
-#include "notify.h"
-#include "p2p_supplicant.h"
-#include "nan_usd.h"
-#include "pr_supplicant.h"
-
-
-static const char *
-tx_status_result_txt(enum offchannel_send_action_result result)
-{
-	switch (result) {
-	case OFFCHANNEL_SEND_ACTION_SUCCESS:
-		return "success";
-	case OFFCHANNEL_SEND_ACTION_NO_ACK:
-		return "no-ack";
-	case OFFCHANNEL_SEND_ACTION_FAILED:
-		return "failed";
-	}
-
-	return "?";
-}
-
-
-static void wpas_nan_de_tx_status(struct wpa_supplicant *wpa_s,
-				  unsigned int freq, const u8 *dst,
-				  const u8 *src, const u8 *bssid,
-				  const u8 *data, size_t data_len,
-				  enum offchannel_send_action_result result)
-{
-	if (!wpa_s->nan_de)
-		return;
-
-	wpa_printf(MSG_DEBUG, "NAN: TX status A1=" MACSTR " A2=" MACSTR
-		   " A3=" MACSTR " freq=%d len=%zu result=%s",
-		   MAC2STR(dst), MAC2STR(src), MAC2STR(bssid), freq,
-		   data_len, tx_status_result_txt(result));
-
-	nan_de_tx_status(wpa_s->nan_de, freq, dst);
-}
-
-
-struct wpas_nan_usd_tx_work {
-	unsigned int freq;
-	unsigned int wait_time;
-	u8 dst[ETH_ALEN];
-	u8 src[ETH_ALEN];
-	u8 bssid[ETH_ALEN];
-	struct wpabuf *buf;
-};
-
-
-static void wpas_nan_usd_tx_work_free(struct wpas_nan_usd_tx_work *twork)
-{
-	if (!twork)
-		return;
-	wpabuf_free(twork->buf);
-	os_free(twork);
-}
-
-
-static void wpas_nan_usd_tx_work_done(struct wpa_supplicant *wpa_s)
-{
-	struct wpas_nan_usd_tx_work *twork;
-
-	if (!wpa_s->nan_usd_tx_work)
-		return;
-
-	twork = wpa_s->nan_usd_tx_work->ctx;
-	wpas_nan_usd_tx_work_free(twork);
-	radio_work_done(wpa_s->nan_usd_tx_work);
-	wpa_s->nan_usd_tx_work = NULL;
-}
-
-
-static int wpas_nan_de_tx_send(struct wpa_supplicant *wpa_s, unsigned int freq,
-			       unsigned int wait_time, const u8 *dst,
-			       const u8 *src, const u8 *bssid,
-			       const struct wpabuf *buf)
-{
-	wpa_printf(MSG_DEBUG, "NAN: TX NAN SDF A1=" MACSTR " A2=" MACSTR
-		   " A3=" MACSTR " freq=%d len=%zu",
-		   MAC2STR(dst), MAC2STR(src), MAC2STR(bssid), freq,
-		   wpabuf_len(buf));
-
-	return offchannel_send_action(wpa_s, freq, dst, src, bssid,
-				      wpabuf_head(buf), wpabuf_len(buf),
-				      wait_time, wpas_nan_de_tx_status, 1);
-}
-
-
-static void wpas_nan_usd_start_tx_cb(struct wpa_radio_work *work, int deinit)
-{
-	struct wpa_supplicant *wpa_s = work->wpa_s;
-	struct wpas_nan_usd_tx_work *twork = work->ctx;
-
-	if (deinit) {
-		if (work->started) {
-			wpa_s->nan_usd_tx_work = NULL;
-			offchannel_send_action_done(wpa_s);
-		}
-		wpas_nan_usd_tx_work_free(twork);
-		return;
-	}
-
-	wpa_s->nan_usd_tx_work = work;
-
-	if (wpas_nan_de_tx_send(wpa_s, twork->freq, twork->wait_time,
-				twork->dst, twork->src, twork->bssid,
-				twork->buf) < 0)
-		wpas_nan_usd_tx_work_done(wpa_s);
-}
-
-
-static int wpas_nan_de_tx(void *ctx, unsigned int freq, unsigned int wait_time,
-			  const u8 *dst, const u8 *src, const u8 *bssid,
-			  const struct wpabuf *buf)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-	struct wpas_nan_usd_tx_work *twork;
-
-	if (wpa_s->nan_usd_tx_work || wpa_s->nan_usd_listen_work) {
-		/* Reuse ongoing radio work */
-		return wpas_nan_de_tx_send(wpa_s, freq, wait_time, dst, src,
-					   bssid, buf);
-	}
-
-	twork = os_zalloc(sizeof(*twork));
-	if (!twork)
-		return -1;
-	twork->freq = freq;
-	twork->wait_time = wait_time;
-	os_memcpy(twork->dst, dst, ETH_ALEN);
-	os_memcpy(twork->src, src, ETH_ALEN);
-	os_memcpy(twork->bssid, bssid, ETH_ALEN);
-	twork->buf = wpabuf_dup(buf);
-	if (!twork->buf) {
-		wpas_nan_usd_tx_work_free(twork);
-		return -1;
-	}
-
-	if (radio_add_work(wpa_s, freq, "nan-usd-tx", 0,
-			   wpas_nan_usd_start_tx_cb, twork) < 0) {
-		wpas_nan_usd_tx_work_free(twork);
-		return -1;
-	}
-
-	return 0;
-}
-
-
-struct wpas_nan_usd_listen_work {
-	unsigned int freq;
-	unsigned int duration;
-};
-
-
-static void wpas_nan_usd_listen_work_done(struct wpa_supplicant *wpa_s)
-{
-	struct wpas_nan_usd_listen_work *lwork;
-
-	if (!wpa_s->nan_usd_listen_work)
-		return;
-
-	lwork = wpa_s->nan_usd_listen_work->ctx;
-	os_free(lwork);
-	radio_work_done(wpa_s->nan_usd_listen_work);
-	wpa_s->nan_usd_listen_work = NULL;
-}
-
-
-static void wpas_nan_usd_remain_on_channel_timeout(void *eloop_ctx,
-						   void *timeout_ctx)
-{
-	struct wpa_supplicant *wpa_s = eloop_ctx;
-	struct wpas_nan_usd_listen_work *lwork = timeout_ctx;
-
-	wpas_nan_usd_cancel_remain_on_channel_cb(wpa_s, lwork->freq);
-}
-
-
-static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
-					 int deinit)
-{
-	struct wpa_supplicant *wpa_s = work->wpa_s;
-	struct wpas_nan_usd_listen_work *lwork = work->ctx;
-	unsigned int duration;
-
-	if (deinit) {
-		if (work->started) {
-			wpa_s->nan_usd_listen_work = NULL;
-			wpa_drv_cancel_remain_on_channel(wpa_s);
-		}
-		os_free(lwork);
-		return;
-	}
-
-	wpa_s->nan_usd_listen_work = work;
-
-	duration = lwork->duration;
-	if (duration > wpa_s->max_remain_on_chan)
-		duration = wpa_s->max_remain_on_chan;
-	wpa_printf(MSG_DEBUG, "NAN: Start listen on %u MHz for %u ms",
-		   lwork->freq, duration);
-	if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration) < 0) {
-		wpa_printf(MSG_DEBUG,
-			   "NAN: Failed to request the driver to remain on channel (%u MHz) for listen",
-			   lwork->freq);
-		eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout,
-				     wpa_s, ELOOP_ALL_CTX);
-		/* Restart the listen state after a delay */
-		eloop_register_timeout(0, 500,
-				       wpas_nan_usd_remain_on_channel_timeout,
-				       wpa_s, lwork);
-		wpas_nan_usd_listen_work_done(wpa_s);
-		return;
-	}
-}
-
-
-static int wpas_nan_de_listen(void *ctx, unsigned int freq,
-			      unsigned int duration)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-	struct wpas_nan_usd_listen_work *lwork;
-
-	lwork = os_zalloc(sizeof(*lwork));
-	if (!lwork)
-		return -1;
-	lwork->freq = freq;
-	lwork->duration = duration;
-
-	if (radio_add_work(wpa_s, freq, "nan-usd-listen", 0,
-			   wpas_nan_usd_start_listen_cb, lwork) < 0) {
-		os_free(lwork);
-		return -1;
-	}
-
-	return 0;
-}
-
-
-static void
-wpas_nan_de_discovery_result(void *ctx, int subscribe_id,
-			     enum nan_service_protocol_type srv_proto_type,
-			     const u8 *ssi, size_t ssi_len, int peer_publish_id,
-			     const u8 *peer_addr, bool fsd, bool fsd_gas)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_notify_nan_discovery_result(wpa_s, srv_proto_type, subscribe_id,
-					 peer_publish_id, peer_addr, fsd,
-					 fsd_gas, ssi, ssi_len);
-}
-
-
-static void wpas_nan_de_replied(void *ctx, int publish_id, const u8 *peer_addr,
-				int peer_subscribe_id,
-				enum nan_service_protocol_type srv_proto_type,
-				const u8 *ssi, size_t ssi_len)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_notify_nan_replied(wpa_s, srv_proto_type, publish_id,
-				peer_subscribe_id, peer_addr, ssi, ssi_len);
-}
-
-
-static void wpas_nan_de_publish_terminated(void *ctx, int publish_id,
-					   enum nan_de_reason reason)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_notify_nan_publish_terminated(wpa_s, publish_id, reason);
-}
-
-
-static void wpas_nan_usd_offload_cancel_publish(void *ctx, int publish_id)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		wpas_drv_nan_cancel_publish(wpa_s, publish_id);
-}
-
-
-static void wpas_nan_de_subscribe_terminated(void *ctx, int subscribe_id,
-					     enum nan_de_reason reason)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_notify_nan_subscribe_terminated(wpa_s, subscribe_id, reason);
-}
-
-
-static void wpas_nan_usd_offload_cancel_subscribe(void *ctx, int subscribe_id)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		wpas_drv_nan_cancel_subscribe(wpa_s, subscribe_id);
-}
-
-
-static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id,
-				const u8 *ssi, size_t ssi_len,
-				const u8 *peer_addr)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
-				ssi, ssi_len);
-}
-
-
-#ifdef CONFIG_P2P
-static void wpas_nan_process_p2p_usd_elems(void *ctx, const u8 *buf,
-					   u16 buf_len, const u8 *peer_addr,
-					   unsigned int freq)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_p2p_process_usd_elems(wpa_s, buf, buf_len, peer_addr, freq);
-}
-#endif /* CONFIG_P2P */
-
-
-#ifdef CONFIG_PR
-static void wpas_nan_process_pr_usd_elems(void *ctx, const u8 *buf, u16 buf_len,
-					  const u8 *peer_addr,
-					  unsigned int freq)
-{
-	struct wpa_supplicant *wpa_s = ctx;
-
-	wpas_pr_process_usd_elems(wpa_s, buf, buf_len, peer_addr, freq);
-}
-#endif /* CONFIG_PR */
-
-
-int wpas_nan_usd_init(struct wpa_supplicant *wpa_s)
-{
-	struct nan_callbacks cb;
-	bool offload = !!(wpa_s->drv_flags2 &
-			  WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD);
-
-	os_memset(&cb, 0, sizeof(cb));
-	cb.ctx = wpa_s;
-	cb.tx = wpas_nan_de_tx;
-	cb.listen = wpas_nan_de_listen;
-	cb.discovery_result = wpas_nan_de_discovery_result;
-	cb.replied = wpas_nan_de_replied;
-	cb.publish_terminated = wpas_nan_de_publish_terminated;
-	cb.subscribe_terminated = wpas_nan_de_subscribe_terminated;
-	cb.offload_cancel_publish = wpas_nan_usd_offload_cancel_publish;
-	cb.offload_cancel_subscribe = wpas_nan_usd_offload_cancel_subscribe;
-	cb.receive = wpas_nan_de_receive;
-#ifdef CONFIG_P2P
-	cb.process_p2p_usd_elems = wpas_nan_process_p2p_usd_elems;
-#endif /* CONFIG_P2P */
-#ifdef CONFIG_PR
-	cb.process_pr_usd_elems = wpas_nan_process_pr_usd_elems;
-#endif /* CONFIG_PR */
-
-	wpa_s->nan_de = nan_de_init(wpa_s->own_addr, offload, false,
-				    wpa_s->max_remain_on_chan, &cb);
-	if (!wpa_s->nan_de)
-		return -1;
-	return 0;
-}
-
-
-void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s)
-{
-	eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout,
-			     wpa_s, ELOOP_ALL_CTX);
-	nan_de_deinit(wpa_s->nan_de);
-	wpa_s->nan_de = NULL;
-}
-
-
-void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
-			 const u8 *a3,
-			 unsigned int freq, const u8 *buf, size_t len)
-{
-	if (!wpa_s->nan_de)
-		return;
-	nan_de_rx_sdf(wpa_s->nan_de, src, a3, freq, buf, len);
-}
-
-
-void wpas_nan_usd_flush(struct wpa_supplicant *wpa_s)
-{
-	if (!wpa_s->nan_de)
-		return;
-	nan_de_flush(wpa_s->nan_de);
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		wpas_drv_nan_flush(wpa_s);
-}
-
-
-int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name,
-			 enum nan_service_protocol_type srv_proto_type,
-			 const struct wpabuf *ssi,
-			 struct nan_publish_params *params, bool p2p)
-{
-	int publish_id;
-	struct wpabuf *elems = NULL;
-	const u8 *addr;
-
-	if (!wpa_s->nan_de)
-		return -1;
-
-	if (params->proximity_ranging && !params->solicited) {
-		wpa_printf(MSG_INFO,
-			   "PR unsolicited publish service discovery not allowed");
-		return -1;
-	}
-
-	addr = wpa_s->own_addr;
-
-	if (p2p) {
-		elems = wpas_p2p_usd_elems(wpa_s, service_name);
-		addr = wpa_s->global->p2p_dev_addr;
-	} else if (params->proximity_ranging) {
-		elems = wpas_pr_usd_elems(wpa_s);
-	}
-
-	publish_id = nan_de_publish(wpa_s->nan_de, service_name, srv_proto_type,
-				    ssi, elems, params, p2p);
-	if (publish_id >= 1 &&
-	    (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
-	    wpas_drv_nan_publish(wpa_s, addr, publish_id, service_name,
-				 nan_de_get_service_id(wpa_s->nan_de,
-						       publish_id),
-				 srv_proto_type, ssi, elems, params) < 0) {
-		nan_de_cancel_publish(wpa_s->nan_de, publish_id);
-		publish_id = -1;
-	}
-
-	wpabuf_free(elems);
-	return publish_id;
-}
-
-
-void wpas_nan_usd_cancel_publish(struct wpa_supplicant *wpa_s, int publish_id)
-{
-	if (!wpa_s->nan_de)
-		return;
-	nan_de_cancel_publish(wpa_s->nan_de, publish_id);
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		wpas_drv_nan_cancel_publish(wpa_s, publish_id);
-}
-
-
-int wpas_nan_usd_update_publish(struct wpa_supplicant *wpa_s, int publish_id,
-				const struct wpabuf *ssi)
-{
-	int ret;
-
-	if (!wpa_s->nan_de)
-		return -1;
-	ret = nan_de_update_publish(wpa_s->nan_de, publish_id, ssi);
-	if (ret == 0 && (wpa_s->drv_flags2 &
-			 WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
-	    wpas_drv_nan_update_publish(wpa_s, publish_id, ssi) < 0)
-		return -1;
-	return ret;
-}
-
-
-int wpas_nan_usd_unpause_publish(struct wpa_supplicant *wpa_s, int publish_id,
-				 u8 peer_instance_id, const u8 *peer_addr)
-{
-	if (!wpa_s->nan_de)
-		return -1;
-	return nan_de_unpause_publish(wpa_s->nan_de, publish_id,
-				      peer_instance_id, peer_addr);
-}
-
-
-static int wpas_nan_stop_listen(struct wpa_supplicant *wpa_s, int id)
-{
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		return 0;
-
-	if (nan_de_stop_listen(wpa_s->nan_de, id) < 0)
-		return -1;
-
-	if (wpa_s->nan_usd_listen_work) {
-		wpa_printf(MSG_DEBUG, "NAN: Stop listen operation");
-		wpa_drv_cancel_remain_on_channel(wpa_s);
-		wpas_nan_usd_listen_work_done(wpa_s);
-	}
-
-	if (wpa_s->nan_usd_tx_work) {
-		wpa_printf(MSG_DEBUG, "NAN: Stop TX wait operation");
-		offchannel_send_action_done(wpa_s);
-		wpas_nan_usd_tx_work_done(wpa_s);
-	}
-
-	return 0;
-}
-
-
-int wpas_nan_usd_publish_stop_listen(struct wpa_supplicant *wpa_s,
-				     int publish_id)
-{
-	if (!wpa_s->nan_de)
-		return -1;
-
-	wpa_printf(MSG_DEBUG, "NAN: Request to stop listen for publish_id=%d",
-		   publish_id);
-	return wpas_nan_stop_listen(wpa_s, publish_id);
-}
-
-
-int wpas_nan_usd_subscribe(struct wpa_supplicant *wpa_s,
-			   const char *service_name,
-			   enum nan_service_protocol_type srv_proto_type,
-			   const struct wpabuf *ssi,
-			   struct nan_subscribe_params *params, bool p2p)
-{
-	int subscribe_id;
-	struct wpabuf *elems = NULL;
-	const u8 *addr;
-
-	if (!wpa_s->nan_de)
-		return -1;
-
-	if (params->proximity_ranging && !params->active) {
-		wpa_printf(MSG_INFO,
-			   "PR passive subscriber service discovery not allowed");
-		return -1;
-	}
-
-	addr = wpa_s->own_addr;
-
-	if (p2p) {
-		elems = wpas_p2p_usd_elems(wpa_s, service_name);
-		addr = wpa_s->global->p2p_dev_addr;
-	} else if (params->proximity_ranging) {
-		elems = wpas_pr_usd_elems(wpa_s);
-	}
-
-	subscribe_id = nan_de_subscribe(wpa_s->nan_de, service_name,
-					srv_proto_type, ssi, elems, params,
-					p2p);
-	if (subscribe_id >= 1 &&
-	    (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD) &&
-	    wpas_drv_nan_subscribe(wpa_s, addr, subscribe_id, service_name,
-				   nan_de_get_service_id(wpa_s->nan_de,
-							 subscribe_id),
-				   srv_proto_type, ssi, elems, params) < 0) {
-		nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id);
-		subscribe_id = -1;
-	}
-
-	wpabuf_free(elems);
-	return subscribe_id;
-}
-
-
-void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
-				   int subscribe_id)
-{
-	if (!wpa_s->nan_de)
-		return;
-	nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id);
-	if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_USD_OFFLOAD)
-		wpas_drv_nan_cancel_subscribe(wpa_s, subscribe_id);
-}
-
-
-int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s,
-				       int subscribe_id)
-{
-	if (!wpa_s->nan_de)
-		return -1;
-
-	wpa_printf(MSG_DEBUG, "NAN: Request to stop listen for subscribe_id=%d",
-		   subscribe_id);
-	return wpas_nan_stop_listen(wpa_s, subscribe_id);
-}
-
-
-int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
-			  const struct wpabuf *ssi, const struct wpabuf *elems,
-			  const u8 *peer_addr, u8 req_instance_id)
-{
-	if (!wpa_s->nan_de)
-		return -1;
-	return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
-			       req_instance_id);
-}
-
-
-void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
-				       unsigned int freq, unsigned int duration)
-{
-	wpas_nan_usd_listen_work_done(wpa_s);
-
-	if (wpa_s->nan_de)
-		nan_de_listen_started(wpa_s->nan_de, freq, duration);
-}
-
-
-void wpas_nan_usd_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
-					      unsigned int freq)
-{
-	if (wpa_s->nan_de)
-		nan_de_listen_ended(wpa_s->nan_de, freq);
-}
-
-
-void wpas_nan_usd_tx_wait_expire(struct wpa_supplicant *wpa_s)
-{
-	wpas_nan_usd_tx_work_done(wpa_s);
-
-	if (wpa_s->nan_de)
-		nan_de_tx_wait_ended(wpa_s->nan_de);
-}
-
-
-int * wpas_nan_usd_all_freqs(struct wpa_supplicant *wpa_s)
-{
-	int i, j;
-	int *freqs = NULL;
-
-	if (!wpa_s->hw.modes)
-		return NULL;
-
-	for (i = 0; i < wpa_s->hw.num_modes; i++) {
-		struct hostapd_hw_modes *mode = &wpa_s->hw.modes[i];
-
-		for (j = 0; j < mode->num_channels; j++) {
-			struct hostapd_channel_data *chan = &mode->channels[j];
-
-			/* All 20 MHz channels on 2.4 and 5 GHz band */
-			if (chan->freq < 2412 || chan->freq > 5900)
-				continue;
-
-			/* that allow frames to be transmitted */
-			if (chan->flag & (HOSTAPD_CHAN_DISABLED |
-					  HOSTAPD_CHAN_NO_IR |
-					  HOSTAPD_CHAN_RADAR))
-				continue;
-
-			int_array_add_unique(&freqs, chan->freq);
-		}
-	}
-
-	return freqs;
-}
-
-
-void wpas_nan_usd_state_change_notif(struct wpa_supplicant *wpa_s)
-{
-	struct wpa_supplicant *ifs;
-	unsigned int n_active = 0;
-	struct nan_de_cfg cfg;
-
-	if (!wpa_s->radio)
-		return;
-
-	os_memset(&cfg, 0, sizeof(cfg));
-
-	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
-			 radio_list) {
-		if (ifs->wpa_state >= WPA_AUTHENTICATING)
-			n_active++;
-	}
-
-	wpa_printf(MSG_DEBUG,
-		   "NAN: state change notif: n_active=%u, p2p_in_progress=%u",
-		   n_active, wpas_p2p_in_progress(wpa_s));
-
-	if (n_active) {
-		cfg.n_max = 3;
-
-		if (!wpas_p2p_in_progress(wpa_s)) {
-			/* Limit the USD operation on channel to 100 - 300 TUs
-			 * to allow more time for other interfaces.
-			 */
-			cfg.n_min = 1;
-		} else {
-			/* Limit the USD operation on channel to 200 - 300 TUs
-			 * to allow P2P operation to complete.
-			 */
-			cfg.n_min = 2;
-		}
-
-		/* Each 500 ms suspend USD operation for 300 ms */
-		cfg.cycle = 500;
-		cfg.suspend = 300;
-	}
-
-	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
-			 radio_list) {
-		if (ifs->nan_de)
-			nan_de_config(ifs->nan_de, &cfg);
-	}
-}
diff --git a/wpa_supplicant/nan_usd.h b/wpa_supplicant/nan_usd.h
deleted file mode 100644
index 394a09c469..0000000000
--- a/wpa_supplicant/nan_usd.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * NAN unsynchronized service discovery (USD)
- * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#ifndef NAN_USD_H
-#define NAN_USD_H
-
-struct nan_subscribe_params;
-struct nan_publish_params;
-enum nan_service_protocol_type;
-
-int wpas_nan_usd_init(struct wpa_supplicant *wpa_s);
-void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s);
-void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
-			 const u8 *a3,
-			 unsigned int freq, const u8 *buf, size_t len);
-void wpas_nan_usd_flush(struct wpa_supplicant *wpa_s);
-int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name,
-			 enum nan_service_protocol_type srv_proto_type,
-			 const struct wpabuf *ssi,
-			 struct nan_publish_params *params, bool p2p);
-void wpas_nan_usd_cancel_publish(struct wpa_supplicant *wpa_s, int publish_id);
-int wpas_nan_usd_update_publish(struct wpa_supplicant *wpa_s, int publish_id,
-				const struct wpabuf *ssi);
-int wpas_nan_usd_unpause_publish(struct wpa_supplicant *wpa_s, int publish_id,
-				 u8 peer_instance_id, const u8 *peer_addr);
-int wpas_nan_usd_publish_stop_listen(struct wpa_supplicant *wpa_s,
-				     int publish_id);
-int wpas_nan_usd_subscribe(struct wpa_supplicant *wpa_s,
-			   const char *service_name,
-			   enum nan_service_protocol_type srv_proto_type,
-			   const struct wpabuf *ssi,
-			   struct nan_subscribe_params *params, bool p2p);
-void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
-				   int subscribe_id);
-int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s,
-				       int subscribe_id);
-int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
-			  const struct wpabuf *ssi, const struct wpabuf *elems,
-			  const u8 *peer_addr, u8 req_instance_id);
-void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
-				       unsigned int freq,
-				       unsigned int duration);
-void wpas_nan_usd_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
-					      unsigned int freq);
-void wpas_nan_usd_tx_wait_expire(struct wpa_supplicant *wpa_s);
-int * wpas_nan_usd_all_freqs(struct wpa_supplicant *wpa_s);
-void wpas_nan_usd_state_change_notif(struct wpa_supplicant *wpa_s);
-
-#endif /* NAN_USD_H */
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 24785a4852..b7c204edcc 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -40,7 +40,7 @@
 #include "wps_supplicant.h"
 #include "p2p_supplicant.h"
 #include "wifi_display.h"
-#include "nan_usd.h"
+#include "nan_supplicant.h"
 
 
 /*
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 15a5c2d1bc..3be7617d82 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -66,7 +66,6 @@
 #include "wpas_kay.h"
 #include "mesh.h"
 #include "dpp_supplicant.h"
-#include "nan_usd.h"
 #include "pr_supplicant.h"
 #include "nan_supplicant.h"
 #ifdef CONFIG_MESH
-- 
2.52.0




More information about the Hostap mailing list