]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Add allow_6ghz parameter to control interface
authorSreeramya Soratkal <ssramya@codeaurora.org>
Tue, 4 May 2021 07:31:49 +0000 (13:01 +0530)
committerJouni Malinen <j@w1.fi>
Mon, 14 Jun 2021 17:24:37 +0000 (20:24 +0300)
Introduce a new allow_6ghz parameter with P2P_CONNECT, P2P_GROUP_ADD,
and P2P_INVITE commands for P2P connection on the 6 GHz channels when
Wi-Fi Display is enabled on both the devices. This commit is only adding
the interface change without changing any actual P2P functionality.

Signed-off-by: Sreeramya Soratkal <ssramya@codeaurora.org>
wpa_supplicant/ctrl_iface.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h

index 37329704db98b6c6471d528a78e985d5a4e4f0b0..4e8b30aba2f332bb852c7bf4d3135ba27b75319f 100644 (file)
@@ -6046,6 +6046,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
        u8 _group_ssid[SSID_MAX_LEN], *group_ssid = NULL;
        size_t group_ssid_len = 0;
        int he;
+       bool allow_6ghz;
 
        if (!wpa_s->global->p2p_init_wpa_s)
                return -1;
@@ -6083,6 +6084,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
                }
        }
        join = os_strstr(pos, " join") != NULL;
+       allow_6ghz = os_strstr(pos, " allow_6ghz") != NULL;
        auth = os_strstr(pos, " auth") != NULL;
        automatic = os_strstr(pos, " auto") != NULL;
        pd = os_strstr(pos, " provdisc") != NULL;
@@ -6162,7 +6164,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
                                   persistent_group, automatic, join,
                                   auth, go_intent, freq, freq2, persistent_id,
                                   pd, ht40, vht, max_oper_chwidth, he, edmg,
-                                  group_ssid, group_ssid_len);
+                                  group_ssid, group_ssid_len, allow_6ghz);
        if (new_pin == -2) {
                os_memcpy(buf, "FAIL-CHANNEL-UNAVAILABLE\n", 25);
                return 25;
@@ -6719,6 +6721,7 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
        int freq = 0, pref_freq = 0;
        int ht40, vht, he, max_oper_chwidth, chwidth = 0, freq2 = 0;
        int edmg;
+       bool allow_6ghz;
 
        id = atoi(cmd);
        pos = os_strstr(cmd, " peer=");
@@ -6770,8 +6773,11 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
        if (max_oper_chwidth < 0)
                return -1;
 
+       allow_6ghz = os_strstr(cmd, " allow_6ghz") != NULL;
+
        return wpas_p2p_invite(wpa_s, _peer, ssid, NULL, freq, freq2, ht40, vht,
-                              max_oper_chwidth, pref_freq, he, edmg);
+                              max_oper_chwidth, pref_freq, he, edmg,
+                              allow_6ghz);
 }
 
 
@@ -6779,6 +6785,7 @@ static int p2p_ctrl_invite_group(struct wpa_supplicant *wpa_s, char *cmd)
 {
        char *pos;
        u8 peer[ETH_ALEN], go_dev_addr[ETH_ALEN], *go_dev = NULL;
+       bool allow_6ghz;
 
        pos = os_strstr(cmd, " peer=");
        if (!pos)
@@ -6791,6 +6798,8 @@ static int p2p_ctrl_invite_group(struct wpa_supplicant *wpa_s, char *cmd)
                return -1;
        }
 
+       allow_6ghz = os_strstr(pos, " allow_6ghz") != NULL;
+
        pos = os_strstr(pos, " go_dev_addr=");
        if (pos) {
                pos += 13;
@@ -6802,7 +6811,7 @@ static int p2p_ctrl_invite_group(struct wpa_supplicant *wpa_s, char *cmd)
                go_dev = go_dev_addr;
        }
 
-       return wpas_p2p_invite_group(wpa_s, cmd, peer, go_dev);
+       return wpas_p2p_invite_group(wpa_s, cmd, peer, go_dev, allow_6ghz);
 }
 
 
@@ -6820,7 +6829,7 @@ static int p2p_ctrl_invite(struct wpa_supplicant *wpa_s, char *cmd)
 static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s,
                                         int id, int freq, int vht_center_freq2,
                                         int ht40, int vht, int vht_chwidth,
-                                        int he, int edmg)
+                                        int he, int edmg, bool allow_6ghz)
 {
        struct wpa_ssid *ssid;
 
@@ -6835,13 +6844,14 @@ static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s,
        return wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq,
                                             vht_center_freq2, 0, ht40, vht,
                                             vht_chwidth, he, edmg,
-                                            NULL, 0, 0);
+                                            NULL, 0, 0, allow_6ghz);
 }
 
 
 static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
 {
        int freq = 0, persistent = 0, group_id = -1;
+       bool allow_6ghz = false;
        int vht = wpa_s->conf->p2p_go_vht;
        int ht40 = wpa_s->conf->p2p_go_ht40 || vht;
        int he = wpa_s->conf->p2p_go_he;
@@ -6874,6 +6884,8 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
                        edmg = 1;
                } else if (os_strcmp(token, "persistent") == 0) {
                        persistent = 1;
+               } else if (os_strcmp(token, "allow_6ghz") == 0) {
+                       allow_6ghz = true;
                } else {
                        wpa_printf(MSG_DEBUG,
                                   "CTRL: Invalid P2P_GROUP_ADD parameter: '%s'",
@@ -6910,10 +6922,10 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
                return p2p_ctrl_group_add_persistent(wpa_s, group_id,
                                                     freq, freq2, ht40, vht,
                                                     max_oper_chwidth, he,
-                                                    edmg);
+                                                    edmg, allow_6ghz);
 
        return wpas_p2p_group_add(wpa_s, persistent, freq, freq2, ht40, vht,
-                                 max_oper_chwidth, he, edmg);
+                                 max_oper_chwidth, he, edmg, allow_6ghz);
 }
 
 
index f7632e4ecb5519dc5f9f59e6ec06b6eacd0cee1e..565ced0fd7e257c6a584c763603f4f6f2f95cc7e 100644 (file)
@@ -425,14 +425,15 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message,
                        goto inv_args;
 
                if (wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, 0, 0, 0,
-                                                 0, 0, 0, 0, NULL, 0, 0)) {
+                                                 0, 0, 0, 0, NULL, 0, 0,
+                                                 false)) {
                        reply = wpas_dbus_error_unknown_error(
                                message,
                                "Failed to reinvoke a persistent group");
                        goto out;
                }
        } else if (wpas_p2p_group_add(wpa_s, persistent_group, freq, 0, 0, 0,
-                                     0, 0, 0))
+                                     0, 0, 0, false))
                goto inv_args;
 
 out:
@@ -653,7 +654,7 @@ DBusMessage * wpas_dbus_handler_p2p_connect(DBusMessage *message,
        new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
                                   persistent_group, 0, join, authorize_only,
                                   go_intent, freq, 0, -1, 0, 0, 0, 0, 0, 0,
-                                  NULL, 0);
+                                  NULL, 0, false);
 
        if (new_pin >= 0) {
                char npin[9];
@@ -810,7 +811,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
                        goto err;
 
                if (wpas_p2p_invite(wpa_s, peer_addr, ssid, NULL, 0, 0, 0, 0, 0,
-                                   0, 0, 0) < 0) {
+                                   0, 0, 0, false) < 0) {
                        reply = wpas_dbus_error_unknown_error(
                                message,
                                "Failed to reinvoke a persistent group");
@@ -821,7 +822,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
                 * No group ID means propose to a peer to join my active group
                 */
                if (wpas_p2p_invite_group(wpa_s, wpa_s->ifname,
-                                         peer_addr, NULL)) {
+                                         peer_addr, NULL, false)) {
                        reply = wpas_dbus_error_unknown_error(
                                message, "Failed to join to an active group");
                        goto out;
index 2012fa58eff715e92f29a5180a004c87c90666cf..b950a648e6404f11f5a22b783723202af6bf0d22 100644 (file)
@@ -3236,7 +3236,7 @@ static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
                                wpa_s->conf->p2p_go_he,
                                wpa_s->conf->p2p_go_edmg, NULL,
                                go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0,
-                               1);
+                               1, is_p2p_allow_6ghz(wpa_s->global->p2p));
                } else if (bssid) {
                        wpa_s->user_initiated_pd = 0;
                        wpa_msg_global(wpa_s, MSG_INFO,
@@ -3465,7 +3465,8 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
                                      channels,
                                      ssid->mode == WPAS_MODE_P2P_GO ?
                                      P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
-                                     0, 1);
+                                     0, 1,
+                                     is_p2p_allow_6ghz(wpa_s->global->p2p));
 }
 
 
@@ -4490,10 +4491,10 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev,
                                        persistent_go->mode ==
                                        WPAS_MODE_P2P_GO ?
                                        P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
-                                       0, 0);
+                                       0, 0, false);
                        } else if (response_done) {
                                wpas_p2p_group_add(wpa_s, 1, freq,
-                                                  0, 0, 0, 0, 0, 0);
+                                                  0, 0, 0, 0, 0, 0, false);
                        }
 
                        if (passwd_id == DEV_PW_P2PS_DEFAULT) {
@@ -4612,9 +4613,11 @@ static int wpas_prov_disc_resp_cb(void *ctx)
                        wpa_s, persistent_go, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        NULL,
                        persistent_go->mode == WPAS_MODE_P2P_GO ?
-                       P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 0);
+                       P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 0,
+                       is_p2p_allow_6ghz(wpa_s->global->p2p));
        } else {
-               wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0);
+               wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0,
+                                  is_p2p_allow_6ghz(wpa_s->global->p2p));
        }
 
        return 1;
@@ -5222,7 +5225,8 @@ static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
                                         wpa_s->p2p_go_max_oper_chwidth,
                                         wpa_s->p2p_go_he,
                                         wpa_s->p2p_go_edmg,
-                                        NULL, 0);
+                                        NULL, 0,
+                                        is_p2p_allow_6ghz(wpa_s->global->p2p));
                        return;
                }
 
@@ -5770,6 +5774,7 @@ exit_free:
  *     (CHANWIDTH_*).
  * @group_ssid: Specific Group SSID for join or %NULL if not set
  * @group_ssid_len: Length of @group_ssid in octets
+ * @allow_6ghz: Allow P2P connection on 6 GHz channels
  * Returns: 0 or new PIN (if pin was %NULL) on success, -1 on unspecified
  *     failure, -2 on failure due to channel not currently available,
  *     -3 if forced channel is not supported
@@ -5780,7 +5785,8 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                     int go_intent, int freq, unsigned int vht_center_freq2,
                     int persistent_id, int pd, int ht40, int vht,
                     unsigned int vht_chwidth, int he, int edmg,
-                    const u8 *group_ssid, size_t group_ssid_len)
+                    const u8 *group_ssid, size_t group_ssid_len,
+                    bool allow_6ghz)
 {
        int force_freq = 0, pref_freq = 0;
        int ret = 0, res;
@@ -6690,6 +6696,7 @@ wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
  * @vht:  Start GO with VHT support
  * @vht_chwidth: channel bandwidth for GO operating with VHT support
  * @edmg: Start GO with EDMG support
+ * @allow_6ghz: Allow P2P group creation on a 6 GHz channel
  * Returns: 0 on success, -1 on failure
  *
  * This function creates a new P2P group with the local end as the Group Owner,
@@ -6697,7 +6704,8 @@ wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
  */
 int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
                       int freq, int vht_center_freq2, int ht40, int vht,
-                      int max_oper_chwidth, int he, int edmg)
+                      int max_oper_chwidth, int he, int edmg,
+                      bool allow_6ghz)
 {
        struct p2p_go_neg_results params;
 
@@ -6801,7 +6809,8 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
                                  int vht, int max_oper_chwidth, int he,
                                  int edmg,
                                  const struct p2p_channels *channels,
-                                 int connection_timeout, int force_scan)
+                                 int connection_timeout, int force_scan,
+                                 bool allow_6ghz)
 {
        struct p2p_go_neg_results params;
        int go = 0, freq;
@@ -7430,7 +7439,7 @@ int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                    struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
                    int vht_center_freq2, int ht40, int vht, int max_chwidth,
-                   int pref_freq, int he, int edmg)
+                   int pref_freq, int he, int edmg, bool allow_6ghz)
 {
        enum p2p_invite_role role;
        u8 *bssid = NULL;
@@ -7513,7 +7522,8 @@ int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
 
 /* Invite to join an active group */
 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
-                         const u8 *peer_addr, const u8 *go_dev_addr)
+                         const u8 *peer_addr, const u8 *go_dev_addr,
+                         bool allow_6ghz)
 {
        struct wpa_global *global = wpa_s->global;
        enum p2p_invite_role role;
@@ -8478,7 +8488,7 @@ static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
                         wpa_s->p2p_go_max_oper_chwidth,
                         wpa_s->p2p_go_he,
                         wpa_s->p2p_go_edmg,
-                        NULL, 0);
+                        NULL, 0, is_p2p_allow_6ghz(wpa_s->global->p2p));
        return ret;
 }
 
@@ -9016,7 +9026,7 @@ static int wpas_p2p_nfc_join_group(struct wpa_supplicant *wpa_s,
                                -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
                                wpa_s->p2p_go_he, wpa_s->p2p_go_edmg,
                                params->go_ssid_len ? params->go_ssid : NULL,
-                               params->go_ssid_len);
+                               params->go_ssid_len, false);
 }
 
 
@@ -9095,7 +9105,7 @@ static int wpas_p2p_nfc_init_go_neg(struct wpa_supplicant *wpa_s,
                                forced_freq, wpa_s->p2p_go_vht_center_freq2,
                                -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
                                wpa_s->p2p_go_he, wpa_s->p2p_go_edmg,
-                               NULL, 0);
+                               NULL, 0, false);
 }
 
 
@@ -9112,7 +9122,7 @@ static int wpas_p2p_nfc_resp_go_neg(struct wpa_supplicant *wpa_s,
                               forced_freq, wpa_s->p2p_go_vht_center_freq2,
                               -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
                               wpa_s->p2p_go_he, wpa_s->p2p_go_edmg,
-                              NULL, 0);
+                              NULL, 0, false);
        if (res)
                return res;
 
index 6c11a8dec09bda7893fcf0048da2702c4a5de5fc..dee9c1bcc1e1c0f47244a65f55a5a1b06fb16b7c 100644 (file)
@@ -38,19 +38,21 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                     int go_intent, int freq, unsigned int vht_center_freq2,
                     int persistent_id, int pd, int ht40, int vht,
                     unsigned int vht_chwidth, int he, int edmg,
-                    const u8 *group_ssid, size_t group_ssid_len);
+                    const u8 *group_ssid, size_t group_ssid_len,
+                    bool allow_6ghz);
 int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s,
                                           int freq, struct wpa_ssid *ssid);
 int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
                       int freq, int vht_center_freq2, int ht40, int vht,
-                      int max_oper_chwidth, int he, int edmg);
+                      int max_oper_chwidth, int he, int edmg, bool allow_6ghz);
 int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
                                  struct wpa_ssid *ssid, int addr_allocated,
                                  int force_freq, int neg_freq,
                                  int vht_center_freq2, int ht40, int vht,
                                  int max_oper_chwidth, int he, int edmg,
                                  const struct p2p_channels *channels,
-                                 int connection_timeout, int force_scan);
+                                 int connection_timeout, int force_scan,
+                                 bool allow_6ghz);
 struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
                                       struct wpa_ssid *ssid);
 enum wpas_p2p_prov_disc_use {
@@ -118,9 +120,10 @@ int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr);
 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                    struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
                    int vht_center_freq2, int ht40, int vht, int max_chwidth,
-                   int pref_freq, int he, int edmg);
+                   int pref_freq, int he, int edmg, bool allow_6ghz);
 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
-                         const u8 *peer_addr, const u8 *go_dev_addr);
+                         const u8 *peer_addr, const u8 *go_dev_addr,
+                         bool allow_6ghz);
 int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
                          u32 interval1, u32 duration2, u32 interval2);
 int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,