]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
NAN USD: Use different group address for P2P2
authorShivani Baranwal <quic_shivbara@quicinc.com>
Thu, 14 Nov 2024 08:37:34 +0000 (14:07 +0530)
committerJouni Malinen <j@w1.fi>
Tue, 19 Nov 2024 22:28:00 +0000 (00:28 +0200)
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 <quic_shivbara@quicinc.com>
src/ap/ieee802_11.c
src/common/nan_de.c
src/common/nan_de.h

index 052de0e92423425ee59eaf72b92e60f188e5d6a2..42150e9b50ef1cb3fa8f880d1508e00b5a6189d3 100644 (file)
@@ -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,
index 7a40c9bb7b0c36c8de6b3793d9a133b3cd2590df..077948949e4341d33f5d3fe1b00bd10bb29497a7 100644 (file)
@@ -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);
 
index 188556912a15a81d60535c0789b2e3cee0781720..9c1df317ca63d111408ffba4cb229dcf16b6cbcc 100644 (file)
@@ -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);