]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P2: Allow P2P IE to be added into NAN SDFs
authorShivani Baranwal <quic_shivbara@quicinc.com>
Mon, 5 Aug 2024 09:33:00 +0000 (15:03 +0530)
committerJouni Malinen <j@w1.fi>
Tue, 27 Aug 2024 07:51:56 +0000 (10:51 +0300)
Extend the NAN Subscribe and Publish methods to allow p2p=1 to be
specified to include P2P attributes in a P2P IE to be added into the NAN
Element Container attribute. In addition, use the P2P Device Address for
the NAN SDFs for the P2P cases.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
14 files changed:
hostapd/ctrl_iface.c
src/ap/nan_usd_ap.c
src/ap/nan_usd_ap.h
src/common/nan_de.c
src/common/nan_de.h
src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_build.c
src/p2p/p2p_i.h
wpa_supplicant/ctrl_iface.c
wpa_supplicant/nan_usd.c
wpa_supplicant/nan_usd.h
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h

index 85eb356754958a55ce20864f7bd6fb4bc140d59b..8ef1cb2823dc9ecaf5e08c73def0624459aabd83 100644 (file)
@@ -3745,6 +3745,7 @@ static int hostapd_ctrl_nan_publish(struct hostapd_data *hapd, char *cmd,
        struct wpabuf *ssi = NULL;
        int ret = -1;
        enum nan_service_protocol_type srv_proto_type = 0;
+       bool p2p = false;
 
        os_memset(&params, 0, sizeof(params));
        /* USD shall use both solicited and unsolicited transmissions */
@@ -3778,6 +3779,11 @@ static int hostapd_ctrl_nan_publish(struct hostapd_data *hapd, char *cmd,
                        continue;
                }
 
+               if (os_strcmp(token, "p2p=1") == 0) {
+                       p2p = true;
+                       continue;
+               }
+
                if (os_strcmp(token, "solicited=0") == 0) {
                        params.solicited = false;
                        continue;
@@ -3799,7 +3805,7 @@ static int hostapd_ctrl_nan_publish(struct hostapd_data *hapd, char *cmd,
        }
 
        publish_id = hostapd_nan_usd_publish(hapd, service_name, srv_proto_type,
-                                            ssi, &params);
+                                            ssi, &params, p2p);
        if (publish_id > 0)
                ret = os_snprintf(buf, buflen, "%d", publish_id);
 fail:
@@ -3882,6 +3888,7 @@ static int hostapd_ctrl_nan_subscribe(struct hostapd_data *hapd, char *cmd,
        struct wpabuf *ssi = NULL;
        int ret = -1;
        enum nan_service_protocol_type srv_proto_type = 0;
+       bool p2p = false;
 
        os_memset(&params, 0, sizeof(params));
 
@@ -3915,6 +3922,11 @@ static int hostapd_ctrl_nan_subscribe(struct hostapd_data *hapd, char *cmd,
                        continue;
                }
 
+               if (os_strcmp(token, "p2p=1") == 0) {
+                       p2p = true;
+                       continue;
+               }
+
                wpa_printf(MSG_INFO,
                           "CTRL: Invalid NAN_SUBSCRIBE parameter: %s",
                           token);
@@ -3923,7 +3935,7 @@ static int hostapd_ctrl_nan_subscribe(struct hostapd_data *hapd, char *cmd,
 
        subscribe_id = hostapd_nan_usd_subscribe(hapd, service_name,
                                                 srv_proto_type, ssi,
-                                                &params);
+                                                &params, p2p);
        if (subscribe_id > 0)
                ret = os_snprintf(buf, buflen, "%d", subscribe_id);
 fail:
index 70c6139fd575080a69a64a38adf54f44c6283712..570abfce017c84b43d7661537fe40696fca6bcf6 100644 (file)
@@ -192,7 +192,7 @@ void hostapd_nan_usd_flush(struct hostapd_data *hapd)
 int hostapd_nan_usd_publish(struct hostapd_data *hapd, const char *service_name,
                            enum nan_service_protocol_type srv_proto_type,
                            const struct wpabuf *ssi,
-                           struct nan_publish_params *params)
+                           struct nan_publish_params *params, bool p2p)
 {
        int publish_id;
        struct wpabuf *elems = NULL;
@@ -201,7 +201,7 @@ int hostapd_nan_usd_publish(struct hostapd_data *hapd, const char *service_name,
                return -1;
 
        publish_id = nan_de_publish(hapd->nan_de, service_name, srv_proto_type,
-                                   ssi, elems, params);
+                                   ssi, elems, params, p2p);
        wpabuf_free(elems);
        return publish_id;
 }
@@ -231,7 +231,7 @@ int hostapd_nan_usd_subscribe(struct hostapd_data *hapd,
                              const char *service_name,
                              enum nan_service_protocol_type srv_proto_type,
                              const struct wpabuf *ssi,
-                             struct nan_subscribe_params *params)
+                             struct nan_subscribe_params *params, bool p2p)
 {
        int subscribe_id;
        struct wpabuf *elems = NULL;
@@ -240,7 +240,7 @@ int hostapd_nan_usd_subscribe(struct hostapd_data *hapd,
                return -1;
 
        subscribe_id = nan_de_subscribe(hapd->nan_de, service_name,
-                                       srv_proto_type, ssi, elems, params);
+                                       srv_proto_type, ssi, elems, params, p2p);
        wpabuf_free(elems);
        return subscribe_id;
 }
index 58ff5fc4808ba523e5e8e77172940c3ba6c4c08b..0571643c63e9e10acee1a7dd58136caa9c1b6937 100644 (file)
@@ -21,7 +21,7 @@ void hostapd_nan_usd_flush(struct hostapd_data *hapd);
 int hostapd_nan_usd_publish(struct hostapd_data *hapd, const char *service_name,
                            enum nan_service_protocol_type srv_proto_type,
                            const struct wpabuf *ssi,
-                           struct nan_publish_params *params);
+                           struct nan_publish_params *params, bool p2p);
 void hostapd_nan_usd_cancel_publish(struct hostapd_data *hapd, int publish_id);
 int hostapd_nan_usd_update_publish(struct hostapd_data *hapd, int publish_id,
                                   const struct wpabuf *ssi);
@@ -29,7 +29,7 @@ int hostapd_nan_usd_subscribe(struct hostapd_data *hapd,
                              const char *service_name,
                              enum nan_service_protocol_type srv_proto_type,
                              const struct wpabuf *ssi,
-                             struct nan_subscribe_params *params);
+                             struct nan_subscribe_params *params, bool p2p);
 void hostapd_nan_usd_cancel_subscribe(struct hostapd_data *hapd,
                                      int subscribe_id);
 int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
index 08351ce90d3b4e58566795ea37811afa125a8ab0..c7294c59d5d95157fc0da749306aadc3095b9e6b 100644 (file)
@@ -58,6 +58,7 @@ struct nan_de_service {
        struct os_reltime next_publish_state;
        struct os_reltime next_publish_chan;
        unsigned int next_publish_duration;
+       bool is_p2p;
 };
 
 struct nan_de {
@@ -1218,7 +1219,7 @@ const u8 * nan_de_get_service_id(struct nan_de *de, int id)
 int nan_de_publish(struct nan_de *de, const char *service_name,
                   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, bool p2p)
 {
        int publish_id;
        struct nan_de_service *srv;
@@ -1280,6 +1281,7 @@ int nan_de_publish(struct nan_de *de, const char *service_name,
        wpa_printf(MSG_DEBUG, "NAN: Assigned new publish handle %d for %s",
                   publish_id, service_name);
        srv->id = publish_id;
+       srv->is_p2p = p2p;
        nan_de_add_srv(de, srv);
        nan_de_run_timer(de);
        return publish_id;
@@ -1331,7 +1333,7 @@ int nan_de_update_publish(struct nan_de *de, int publish_id,
 int nan_de_subscribe(struct nan_de *de, const char *service_name,
                     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, bool p2p)
 {
        int subscribe_id;
        struct nan_de_service *srv;
@@ -1371,6 +1373,7 @@ int nan_de_subscribe(struct nan_de *de, const char *service_name,
        wpa_printf(MSG_DEBUG, "NAN: Assigned new subscribe handle %d for %s",
                   subscribe_id, service_name);
        srv->id = subscribe_id;
+       srv->is_p2p = p2p;
        nan_de_add_srv(de, srv);
        nan_de_run_timer(de);
        return subscribe_id;
index ae77cf399db29e2e3aacddd467626c073659eafd..bdac284b4f76eb6af3d2af27f0e01940d5921b01 100644 (file)
@@ -106,7 +106,7 @@ struct nan_publish_params {
 int nan_de_publish(struct nan_de *de, const char *service_name,
                   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, bool p2p);
 
 void nan_de_cancel_publish(struct nan_de *de, int publish_id);
 
@@ -133,7 +133,7 @@ struct nan_subscribe_params {
 int nan_de_subscribe(struct nan_de *de, const char *service_name,
                     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, bool p2p);
 
 void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id);
 
index 8e0fc35dfbf0bf9241033a2189a79ee02b200235..35406f0b967117cc7bee7b0ed197c6dbea47d832 100644 (file)
@@ -5688,3 +5688,43 @@ void set_p2p_allow_6ghz(struct p2p_data *p2p, bool value)
 {
        p2p->allow_6ghz = value;
 }
+
+
+struct wpabuf * p2p_usd_elems(struct p2p_data *p2p)
+{
+       struct wpabuf *buf;
+       u8 *len;
+       u8 group_capab;
+
+       buf = wpabuf_alloc(1000);
+       if (!buf)
+               return NULL;
+
+       len = p2p_buf_add_ie_hdr(buf);
+
+       /* P2P Capability attribute */
+       group_capab = 0;
+       if (p2p->num_groups) {
+               group_capab |= P2P_GROUP_CAPAB_GROUP_OWNER;
+               if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
+                   (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED) &&
+                   p2p->cross_connect)
+                       group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
+       }
+       if (p2p->cfg->p2p_intra_bss)
+               group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
+       p2p_buf_add_capability(buf, p2p->dev_capab &
+                              ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
+                              group_capab);
+
+       /* P2P Device Info attribute */
+       p2p_buf_add_device_info(buf, p2p, NULL);
+
+       p2p_buf_update_ie_hdr(buf, len);
+
+       len = p2p_buf_add_p2p2_ie_hdr(buf);
+
+       p2p_buf_update_ie_hdr(buf, len);
+
+       return buf;
+}
index 27bdac3bf51ceb37aa6f7e7e4d371b10d8cf72c1..ab6e9ca0f42e61186e2a304ebe80948482667ca9 100644 (file)
@@ -2429,5 +2429,6 @@ bool is_p2p_allow_6ghz(struct p2p_data *p2p);
 void set_p2p_allow_6ghz(struct p2p_data *p2p, bool value);
 int p2p_remove_6ghz_channels(struct weighted_pcl *pref_freq_list, int size);
 int p2p_channel_to_freq(int op_class, int channel);
+struct wpabuf * p2p_usd_elems(struct p2p_data *p2p);
 
 #endif /* P2P_H */
index e4f40fe8fcc0f26b4927df2fec20188e5379b390..57f24f26719e9cc2b6172024eac6f8823789aa2f 100644 (file)
@@ -55,11 +55,24 @@ u8 * p2p_buf_add_ie_hdr(struct wpabuf *buf)
 
 void p2p_buf_update_ie_hdr(struct wpabuf *buf, u8 *len)
 {
-       /* Update P2P IE Length */
+       /* Update P2P/P2P2 IE Length */
        *len = (u8 *) wpabuf_put(buf, 0) - len - 1;
 }
 
 
+u8 * p2p_buf_add_p2p2_ie_hdr(struct wpabuf *buf)
+{
+       u8 *len;
+
+       /* P2P2 IE header */
+       wpabuf_put_u8(buf, WLAN_EID_VENDOR_SPECIFIC);
+       len = wpabuf_put(buf, 1); /* IE length to be filled */
+       wpabuf_put_be32(buf, P2P2_IE_VENDOR_TYPE);
+       wpa_printf(MSG_DEBUG, "P2P: * P2P2 IE header");
+       return len;
+}
+
+
 void p2p_buf_add_capability(struct wpabuf *buf, u8 dev_capab, u8 group_capab)
 {
        /* P2P Capability */
index 0a487e031627bf1311ae44e81e75814bc432522d..02082c0fd1f543ff25c695264ebd1f7ad918d581 100644 (file)
@@ -748,6 +748,7 @@ void p2p_buf_add_action_hdr(struct wpabuf *buf, u8 subtype, u8 dialog_token);
 void p2p_buf_add_public_action_hdr(struct wpabuf *buf, u8 subtype,
                                   u8 dialog_token);
 u8 * p2p_buf_add_ie_hdr(struct wpabuf *buf);
+u8 * p2p_buf_add_p2p2_ie_hdr(struct wpabuf *buf);
 void p2p_buf_add_status(struct wpabuf *buf, u8 status);
 void p2p_buf_add_device_info(struct wpabuf *buf, struct p2p_data *p2p,
                             struct p2p_device *peer);
index 96e0740fbded3595aff3d9d3a806c1221ed33bf0..f3d74a869f067bc33c5f6f9a46957ea2014c7c62 100644 (file)
@@ -12202,6 +12202,7 @@ static int wpas_ctrl_nan_publish(struct wpa_supplicant *wpa_s, char *cmd,
        int ret = -1;
        enum nan_service_protocol_type srv_proto_type = 0;
        int *freq_list = NULL;
+       bool p2p = false;
 
        os_memset(&params, 0, sizeof(params));
        /* USD shall use both solicited and unsolicited transmissions */
@@ -12262,6 +12263,11 @@ static int wpas_ctrl_nan_publish(struct wpa_supplicant *wpa_s, char *cmd,
                        continue;
                }
 
+               if (os_strcmp(token, "p2p=1") == 0) {
+                       p2p = true;
+                       continue;
+               }
+
                if (os_strcmp(token, "solicited=0") == 0) {
                        params.solicited = false;
                        continue;
@@ -12283,7 +12289,7 @@ static int wpas_ctrl_nan_publish(struct wpa_supplicant *wpa_s, char *cmd,
        }
 
        publish_id = wpas_nan_usd_publish(wpa_s, service_name, srv_proto_type,
-                                         ssi, &params);
+                                         ssi, &params, p2p);
        if (publish_id > 0)
                ret = os_snprintf(buf, buflen, "%d", publish_id);
 fail:
@@ -12367,6 +12373,7 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
        struct wpabuf *ssi = NULL;
        int ret = -1;
        enum nan_service_protocol_type srv_proto_type = 0;
+       bool p2p = false;
 
        os_memset(&params, 0, sizeof(params));
        params.freq = NAN_USD_DEFAULT_FREQ;
@@ -12406,6 +12413,11 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
                        continue;
                }
 
+               if (os_strcmp(token, "p2p=1") == 0) {
+                       p2p = true;
+                       continue;
+               }
+
                wpa_printf(MSG_INFO,
                           "CTRL: Invalid NAN_SUBSCRIBE parameter: %s",
                           token);
@@ -12414,7 +12426,7 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
 
        subscribe_id = wpas_nan_usd_subscribe(wpa_s, service_name,
                                              srv_proto_type, ssi,
-                                             &params);
+                                             &params, p2p);
        if (subscribe_id > 0)
                ret = os_snprintf(buf, buflen, "%d", subscribe_id);
 fail:
index a79113c584d55b50d52d5f4d39eaa29113a4cb01..9c2c7cab52c3f6a7291a26c8b58277df9e3783b0 100644 (file)
@@ -13,6 +13,7 @@
 #include "wpa_supplicant_i.h"
 #include "offchannel.h"
 #include "driver_i.h"
+#include "p2p_supplicant.h"
 #include "nan_usd.h"
 
 
@@ -386,20 +387,27 @@ 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)
+                        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 (p2p) {
+               elems = wpas_p2p_usd_elems(wpa_s);
+               addr = wpa_s->global->p2p_dev_addr;
+       } else {
+               addr = wpa_s->own_addr;
+       }
+
        publish_id = nan_de_publish(wpa_s->nan_de, service_name, srv_proto_type,
-                                   ssi, elems, params);
+                                   ssi, elems, params, p2p);
        if (publish_id >= 1 &&
            (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_OFFLOAD) &&
-           wpas_drv_nan_publish(wpa_s, wpa_s->own_addr, publish_id,
-                                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) {
@@ -441,20 +449,28 @@ 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)
+                          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 (p2p) {
+               elems = wpas_p2p_usd_elems(wpa_s);
+               addr = wpa_s->global->p2p_dev_addr;
+       } else {
+               addr = wpa_s->own_addr;
+       }
+
        subscribe_id = nan_de_subscribe(wpa_s->nan_de, service_name,
-                                       srv_proto_type, ssi, elems, params);
+                                       srv_proto_type, ssi, elems, params,
+                                       p2p);
        if (subscribe_id >= 1 &&
            (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_NAN_OFFLOAD) &&
-           wpas_drv_nan_subscribe(wpa_s, wpa_s->own_addr, subscribe_id,
-                                  service_name,
+           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) {
index 149ac9e60adf9eb60afb91f04f172ee4c443c4da..ecb4973c47260265b9558ce79f125837e8d67ff7 100644 (file)
@@ -21,7 +21,7 @@ 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);
+                        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);
@@ -29,7 +29,7 @@ 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);
+                          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_transmit(struct wpa_supplicant *wpa_s, int handle,
index 70025f1e4a56cc6629f0079769c8021cf9aad727..2df2d108bd9a151a2cd047f1d8e7127307bb3414 100644 (file)
@@ -10242,3 +10242,13 @@ int wpas_p2p_lo_stop(struct wpa_supplicant *wpa_s)
        wpa_s->p2p_lo_started = 0;
        return ret;
 }
+
+
+struct wpabuf * wpas_p2p_usd_elems(struct wpa_supplicant *wpa_s)
+{
+       struct p2p_data *p2p = wpa_s->global->p2p;
+
+       if (wpa_s->global->p2p_disabled || !p2p)
+               return NULL;
+       return p2p_usd_elems(p2p);
+}
index d71f7701c159b3987ef3f9af3242a7b3fb182344..441e063d92985b19b947716586599bfb62e1baae 100644 (file)
@@ -225,6 +225,7 @@ int wpas_p2p_lo_start(struct wpa_supplicant *wpa_s, unsigned int freq,
                      unsigned int count);
 int wpas_p2p_lo_stop(struct wpa_supplicant *wpa_s);
 int wpas_p2p_mac_setup(struct wpa_supplicant *wpa_s);
+struct wpabuf * wpas_p2p_usd_elems(struct wpa_supplicant *wpa_s);
 
 #else /* CONFIG_P2P */
 
@@ -351,6 +352,11 @@ static inline int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s,
        return 0;
 }
 
+static inline struct wpabuf * wpas_p2p_usd_elems(struct wpa_supplicant *wpa_s)
+{
+       return NULL;
+}
+
 #endif /* CONFIG_P2P */
 
 #endif /* P2P_SUPPLICANT_H */