[PATCH v3 08/46] NAN: Use protocol-specific network ID in USD offload to driver

Kavita Kavita kavita.kavita at oss.qualcomm.com
Wed May 13 02:59:32 PDT 2026


From: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>

Add network_id parameter to nan_publish() and nan_subscribe() driver
operations and pass the appropriate network ID (nan_network_id or
p2p_network_id) based on the protocol being used, so the driver can
include the correct network ID in publish/subscribe frames during
USD offload.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>
---
 src/drivers/driver.h            |  6 ++++--
 src/drivers/driver_nl80211.c    | 14 ++++++++++----
 wpa_supplicant/driver_i.h       | 11 +++++++----
 wpa_supplicant/nan_supplicant.c | 18 ++++++++++++++++--
 4 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 69231d468..bbab06e7b 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -5683,7 +5683,8 @@ struct wpa_driver_ops {
 			   const char *service_name, const u8 *service_id,
 			   enum nan_service_protocol_type srv_proto_type,
 			   const struct wpabuf *ssi, const struct wpabuf *elems,
-			   struct nan_publish_params *params);
+			   struct nan_publish_params *params,
+			   const u8 *network_id);
 
 	/**
 	 * nan_cancel_publish - NAN offload for CancelPublish()
@@ -5720,7 +5721,8 @@ struct wpa_driver_ops {
 			     enum nan_service_protocol_type srv_proto_type,
 			     const struct wpabuf *ssi,
 			     const struct wpabuf *elems,
-			     struct nan_subscribe_params *params);
+			     struct nan_subscribe_params *params,
+			     const u8 *network_id);
 
 	/**
 	 * nan_cancel_subscribe - NAN offload for CancelSubscribe()
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 6adc7c853..3b50ffca3 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -14395,7 +14395,8 @@ static int nl80211_nan_publish(void *priv, const u8 *src, int publish_id,
 			       enum nan_service_protocol_type srv_proto_type,
 			       const struct wpabuf *ssi,
 			       const struct wpabuf *elems,
-			       struct nan_publish_params *params)
+			       struct nan_publish_params *params,
+			       const u8 *network_id)
 {
 	struct i802_bss *bss = priv;
 	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -14431,7 +14432,9 @@ static int nl80211_nan_publish(void *priv, const u8 *src, int publish_id,
 	    (elems && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_ELEMENT_CONTAINER,
 		    wpabuf_len(elems), wpabuf_head(elems))) ||
 	    (ssi && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_SSI,
-			    wpabuf_len(ssi), wpabuf_head(ssi))))
+			    wpabuf_len(ssi), wpabuf_head(ssi))) ||
+	    (network_id && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_NETWORK_ID,
+				   ETH_ALEN, network_id)))
 		goto fail;
 
 	attr = nla_nest_start(msg, QCA_WLAN_VENDOR_ATTR_USD_CHAN_CONFIG);
@@ -14547,7 +14550,8 @@ static int nl80211_nan_subscribe(void *priv, const u8 *src, int subscribe_id,
 				 enum nan_service_protocol_type srv_proto_type,
 				 const struct wpabuf *ssi,
 				 const struct wpabuf *elems,
-				 struct nan_subscribe_params *params)
+				 struct nan_subscribe_params *params,
+				 const u8 *network_id)
 {
 	struct i802_bss *bss = priv;
 	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -14584,7 +14588,9 @@ static int nl80211_nan_subscribe(void *priv, const u8 *src, int subscribe_id,
 	    (elems && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_ELEMENT_CONTAINER,
 		    wpabuf_len(elems), wpabuf_head(elems))) ||
 	    (ssi && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_SSI,
-			    wpabuf_len(ssi), wpabuf_head(ssi))))
+			    wpabuf_len(ssi), wpabuf_head(ssi))) ||
+	    (network_id && nla_put(msg, QCA_WLAN_VENDOR_ATTR_USD_NETWORK_ID,
+				   ETH_ALEN, network_id)))
 		goto fail;
 
 	attr = nla_nest_start(msg, QCA_WLAN_VENDOR_ATTR_USD_CHAN_CONFIG);
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
index f92a96e02..034827488 100644
--- a/wpa_supplicant/driver_i.h
+++ b/wpa_supplicant/driver_i.h
@@ -1222,14 +1222,15 @@ wpas_drv_nan_publish(struct wpa_supplicant *wpa_s, const u8 *addr,
 		     const u8 *service_id,
 		     enum nan_service_protocol_type srv_proto_type,
 		     const struct wpabuf *ssi, const struct wpabuf *elems,
-		     struct nan_publish_params *params)
+		     struct nan_publish_params *params, const u8 *network_id)
 {
 	if (!wpa_s->driver->nan_publish)
 		return 0;
 
 	return wpa_s->driver->nan_publish(wpa_s->drv_priv, addr, publish_id,
 					  service_name, service_id,
-					  srv_proto_type, ssi, elems, params);
+					  srv_proto_type, ssi, elems, params,
+					  network_id);
 }
 
 static inline int
@@ -1258,14 +1259,16 @@ wpas_drv_nan_subscribe(struct wpa_supplicant *wpa_s, const u8 *addr,
 		       const u8 *service_id,
 		       enum nan_service_protocol_type srv_proto_type,
 		       const struct wpabuf *ssi, const struct wpabuf *elems,
-		       struct nan_subscribe_params *params)
+		       struct nan_subscribe_params *params,
+		       const u8 *network_id)
 {
 	if (!wpa_s->driver->nan_subscribe)
 		return 0;
 
 	return wpa_s->driver->nan_subscribe(wpa_s->drv_priv, addr, subscribe_id,
 					    service_name, service_id,
-					    srv_proto_type, ssi, elems, params);
+					    srv_proto_type, ssi, elems, params,
+					    network_id);
 }
 
 static inline int
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 3a578334c..5c162ad8b 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -4460,6 +4460,7 @@ int wpas_nan_publish(struct wpa_supplicant *wpa_s, const char *service_name,
 	int publish_id;
 	struct wpabuf *elems = NULL;
 	const u8 *addr;
+	const u8 *network_id = NULL;
 
 	if (!wpa_s->nan_de)
 		return -1;
@@ -4501,6 +4502,11 @@ int wpas_nan_publish(struct wpa_supplicant *wpa_s, const char *service_name,
 	}
 #endif /* CONFIG_NAN */
 
+	if (p2p)
+		network_id = p2p_network_id;
+	else
+		network_id = nan_network_id;
+
 	if (p2p) {
 		elems = wpas_p2p_usd_elems(wpa_s, service_name);
 		addr = wpa_s->global->p2p_dev_addr;
@@ -4523,7 +4529,8 @@ int wpas_nan_publish(struct wpa_supplicant *wpa_s, const char *service_name,
 	    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) {
+				 srv_proto_type, ssi, elems, params,
+				 network_id) < 0) {
 		nan_de_cancel_publish(wpa_s->nan_de, publish_id);
 		publish_id = -1;
 	}
@@ -4620,6 +4627,7 @@ int wpas_nan_subscribe(struct wpa_supplicant *wpa_s,
 	int subscribe_id;
 	struct wpabuf *elems = NULL;
 	const u8 *addr;
+	const u8 *network_id = NULL;
 
 	if (!wpa_s->nan_de)
 		return -1;
@@ -4660,6 +4668,11 @@ int wpas_nan_subscribe(struct wpa_supplicant *wpa_s,
 	}
 #endif /* CONFIG_NAN */
 
+	if (p2p)
+		network_id = p2p_network_id;
+	else
+		network_id = nan_network_id;
+
 	if (p2p) {
 		elems = wpas_p2p_usd_elems(wpa_s, service_name);
 		addr = wpa_s->global->p2p_dev_addr;
@@ -4683,7 +4696,8 @@ int wpas_nan_subscribe(struct wpa_supplicant *wpa_s,
 	    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) {
+				   srv_proto_type, ssi, elems, params,
+				   network_id) < 0) {
 		nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id);
 		subscribe_id = -1;
 	}
-- 
2.34.1




More information about the Hostap mailing list