[PATCH] NAN: Fix A3 for P2P2 USD

Andrei Otcheretianski andrei.otcheretianski at intel.com
Thu Dec 19 01:18:50 PST 2024


According to WFD spec, address 3 in multicast USD frames shall be set to
wildcard bssid. For unicast USD frames, address 3 shall be set to P2P
device address of the sender. Fix it.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
 src/common/nan_de.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index c38fd9ba60..0e6b4d5fdd 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -27,6 +27,9 @@ enum nan_de_service_type {
 static const u8 p2p_network_id[ETH_ALEN] =
 { 0x51, 0x6f, 0x9a, 0x02, 0x00, 0x00 };
 
+static const u8 wildcard_bssid[ETH_ALEN] =
+{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+
 struct nan_de_service {
 	int id;
 	enum nan_de_service_type type;
@@ -353,6 +356,7 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,
 	enum nan_service_control_type type;
 	unsigned int wait_time = 100;
 	const u8 *network_id;
+	const u8 *bssid;
 
 	if (srv->type == NAN_DE_PUBLISH) {
 		int ms;
@@ -370,12 +374,15 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,
 		return;
 	}
 
-	if (srv->is_p2p)
+	if (srv->is_p2p) {
 		network_id = p2p_network_id;
-	else
+		bssid = wildcard_bssid;
+	} else {
 		network_id = nan_network_id;
+		bssid = nan_network_id;
+	}
 
-	nan_de_tx_sdf(de, srv, wait_time, type, network_id, network_id,
+	nan_de_tx_sdf(de, srv, wait_time, type, network_id, bssid,
 		      req_instance_id, srv->ssi);
 	os_get_reltime(&srv->last_multicast);
 }
@@ -1020,6 +1027,8 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
 
 	if (srv->publish.solicited_multicast || !a3)
 		a3 = network_id;
+	else if (srv->is_p2p)
+		a3 = de->nmi;
 
 	nan_de_tx(de, srv->freq, 100,
 		  srv->publish.solicited_multicast ? network_id : peer_addr,
-- 
2.43.0




More information about the Hostap mailing list