From b36142a740c1b50b78567a73b3202fbf22156517 Mon Sep 17 00:00:00 2001 From: Sreeramya Soratkal Date: Tue, 4 May 2021 13:01:49 +0530 Subject: [PATCH] P2P: Add allow_6ghz parameter to control interface 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 --- wpa_supplicant/ctrl_iface.c | 26 +++++++++---- wpa_supplicant/dbus/dbus_new_handlers_p2p.c | 11 +++--- wpa_supplicant/p2p_supplicant.c | 42 +++++++++++++-------- wpa_supplicant/p2p_supplicant.h | 13 ++++--- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 37329704d..4e8b30aba 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -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); } diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c index f7632e4ec..565ced0fd 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c +++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c @@ -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; diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 2012fa58e..b950a648e 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -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; diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index 6c11a8dec..dee9c1bcc 100644 --- a/wpa_supplicant/p2p_supplicant.h +++ b/wpa_supplicant/p2p_supplicant.h @@ -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,