From: Shivani Baranwal Date: Thu, 14 Nov 2024 08:37:34 +0000 (+0530) Subject: NAN USD: Use different group address for P2P2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd8b3ad8dbeb43e92118a564e00e60dee0e7dcb6;p=thirdparty%2Fhostap.git NAN USD: Use different group address for P2P2 P2P2 uses USD with a different group address than the NAN Network ID defined in the Wi-Fi Aware specification. Select the group address based on whether USD is used with P2P2 or something else. This changes behavior only for the P2P2 cases. Signed-off-by: Shivani Baranwal --- diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 052de0e92..42150e9b5 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -6365,6 +6365,8 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, #ifdef CONFIG_NAN_USD static const u8 nan_network_id[ETH_ALEN] = { 0x51, 0x6f, 0x9a, 0x01, 0x00, 0x00 }; + static const u8 p2p_network_id[ETH_ALEN] = + { 0x51, 0x6f, 0x9a, 0x02, 0x00, 0x00 }; #endif /* CONFIG_NAN_USD */ if (len < 24) @@ -6399,6 +6401,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, if (!is_broadcast_ether_addr(mgmt->bssid) && #ifdef CONFIG_NAN_USD !nan_de_is_nan_network_id(mgmt->bssid) && + !nan_de_is_p2p_network_id(mgmt->bssid) && #endif /* CONFIG_NAN_USD */ #ifdef CONFIG_P2P /* Invitation responses can be sent with the peer MAC as BSSID */ @@ -6437,6 +6440,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, #endif /* CONFIG_IEEE80211BE */ #ifdef CONFIG_NAN_USD !ether_addr_equal(mgmt->da, nan_network_id) && + !ether_addr_equal(mgmt->da, p2p_network_id) && #endif /* CONFIG_NAN_USD */ !ether_addr_equal(mgmt->da, hapd->own_addr)) { hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, diff --git a/src/common/nan_de.c b/src/common/nan_de.c index 7a40c9bb7..077948949 100644 --- a/src/common/nan_de.c +++ b/src/common/nan_de.c @@ -24,6 +24,9 @@ enum nan_de_service_type { NAN_DE_SUBSCRIBE, }; +static const u8 p2p_network_id[ETH_ALEN] = +{ 0x51, 0x6f, 0x9a, 0x02, 0x00, 0x00 }; + struct nan_de_service { int id; enum nan_de_service_type type; @@ -85,6 +88,12 @@ bool nan_de_is_nan_network_id(const u8 *addr) } +bool nan_de_is_p2p_network_id(const u8 *addr) +{ + return ether_addr_equal(addr, p2p_network_id); +} + + struct nan_de * nan_de_init(const u8 *nmi, bool offload, bool ap, unsigned int max_listen, const struct nan_callbacks *cb) @@ -343,6 +352,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; if (srv->type == NAN_DE_PUBLISH) { int ms; @@ -360,7 +370,12 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv, return; } - nan_de_tx_sdf(de, srv, wait_time, type, nan_network_id, nan_network_id, + if (srv->is_p2p) + network_id = p2p_network_id; + else + network_id = nan_network_id; + + nan_de_tx_sdf(de, srv, wait_time, type, network_id, network_id, req_instance_id, srv->ssi); os_get_reltime(&srv->last_multicast); } @@ -921,6 +936,7 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv, size_t len = 0, sda_len, sdea_len; u8 ctrl = 0; u16 sdea_ctrl = 0; + const u8 *network_id; /* Publish function processing of a receive Subscribe message */ @@ -997,11 +1013,16 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv, wpabuf_put_buf(buf, srv->elems); } + if (srv->is_p2p) + network_id = p2p_network_id; + else + network_id = nan_network_id; + if (srv->publish.solicited_multicast || !a3) - a3 = nan_network_id; + a3 = network_id; nan_de_tx(de, srv->freq, 100, - srv->publish.solicited_multicast ? nan_network_id : peer_addr, + srv->publish.solicited_multicast ? network_id : peer_addr, de->nmi, a3, buf); wpabuf_free(buf); @@ -1478,6 +1499,7 @@ int nan_de_transmit(struct nan_de *de, int handle, { struct nan_de_service *srv; const u8 *a3; + const u8 *network_id; if (handle < 1 || handle > NAN_DE_MAX_SERVICE) return -1; @@ -1486,10 +1508,15 @@ int nan_de_transmit(struct nan_de *de, int handle, if (!srv) return -1; + if (srv->is_p2p) + network_id = p2p_network_id; + else + network_id = nan_network_id; + if (srv->a3_set) a3 = srv->a3; else - a3 = nan_network_id; + a3 = network_id; nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP, peer_addr, a3, req_instance_id, ssi); diff --git a/src/common/nan_de.h b/src/common/nan_de.h index 188556912..9c1df317c 100644 --- a/src/common/nan_de.h +++ b/src/common/nan_de.h @@ -60,6 +60,7 @@ struct nan_callbacks { }; bool nan_de_is_nan_network_id(const u8 *addr); +bool nan_de_is_p2p_network_id(const u8 *addr); struct nan_de * nan_de_init(const u8 *nmi, bool offload, bool ap, unsigned int max_listen, const struct nan_callbacks *cb);