P2P: Add optional "ht40" argument for p2p_connect
This can be used to start negotiated GO in 40 MHz channel width in 5GHz band. Signed-hostap: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
This commit is contained in:
parent
7aeac98509
commit
e2308e4b45
6 changed files with 21 additions and 8 deletions
|
@ -2990,10 +2990,12 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
|||
int go_intent = -1;
|
||||
int freq = 0;
|
||||
int pd;
|
||||
int ht40;
|
||||
|
||||
/* <addr> <"pbc" | "pin" | PIN> [label|display|keypad]
|
||||
* [persistent|persistent=<network id>]
|
||||
* [join] [auth] [go_intent=<0..15>] [freq=<in MHz>] [provdisc] */
|
||||
* [join] [auth] [go_intent=<0..15>] [freq=<in MHz>] [provdisc]
|
||||
* [ht40] */
|
||||
|
||||
if (hwaddr_aton(cmd, addr))
|
||||
return -1;
|
||||
|
@ -3021,6 +3023,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
|||
auth = os_strstr(pos, " auth") != NULL;
|
||||
automatic = os_strstr(pos, " auto") != NULL;
|
||||
pd = os_strstr(pos, " provdisc") != NULL;
|
||||
ht40 = os_strstr(pos, " ht40") != NULL;
|
||||
|
||||
pos2 = os_strstr(pos, " go_intent=");
|
||||
if (pos2) {
|
||||
|
@ -3060,7 +3063,8 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
|||
|
||||
new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
|
||||
persistent_group, automatic, join,
|
||||
auth, go_intent, freq, persistent_id, pd);
|
||||
auth, go_intent, freq, persistent_id, pd,
|
||||
ht40);
|
||||
if (new_pin == -2) {
|
||||
os_memcpy(buf, "FAIL-CHANNEL-UNAVAILABLE\n", 25);
|
||||
return 25;
|
||||
|
|
|
@ -504,7 +504,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, -1, 0);
|
||||
go_intent, freq, -1, 0, 0);
|
||||
|
||||
if (new_pin >= 0) {
|
||||
char npin[9];
|
||||
|
|
|
@ -1018,6 +1018,9 @@ void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
|
|||
return;
|
||||
}
|
||||
|
||||
if (wpa_s->p2p_go_ht40)
|
||||
res->ht40 = 1;
|
||||
|
||||
wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS);
|
||||
wpas_notify_p2p_go_neg_completed(wpa_s, res);
|
||||
|
||||
|
@ -2871,7 +2874,8 @@ static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
|
|||
wpa_s->p2p_go_intent,
|
||||
wpa_s->p2p_connect_freq,
|
||||
wpa_s->p2p_persistent_id,
|
||||
wpa_s->p2p_pd_before_go_neg);
|
||||
wpa_s->p2p_pd_before_go_neg,
|
||||
wpa_s->p2p_go_ht40);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3157,6 +3161,7 @@ static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s)
|
|||
* parameters or -1 to generate new values (SSID/passphrase)
|
||||
* @pd: Whether to send Provision Discovery prior to GO Negotiation as an
|
||||
* interoperability workaround when initiating group formation
|
||||
* @ht40: Start GO with 40 MHz channel width
|
||||
* 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
|
||||
|
@ -3164,7 +3169,8 @@ static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s)
|
|||
int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||
const char *pin, enum p2p_wps_method wps_method,
|
||||
int persistent_group, int auto_join, int join, int auth,
|
||||
int go_intent, int freq, int persistent_id, int pd)
|
||||
int go_intent, int freq, int persistent_id, int pd,
|
||||
int ht40)
|
||||
{
|
||||
int force_freq = 0, oper_freq = 0;
|
||||
u8 bssid[ETH_ALEN];
|
||||
|
@ -3196,6 +3202,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
|||
wpa_s->p2p_connect_freq = freq;
|
||||
wpa_s->p2p_fallback_to_go_neg = 0;
|
||||
wpa_s->p2p_pd_before_go_neg = !!pd;
|
||||
wpa_s->p2p_go_ht40 = !!ht40;
|
||||
|
||||
if (pin)
|
||||
os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
|
||||
|
@ -4947,7 +4954,8 @@ static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
|
|||
wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
|
||||
0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
|
||||
wpa_s->p2p_persistent_id,
|
||||
wpa_s->p2p_pd_before_go_neg);
|
||||
wpa_s->p2p_pd_before_go_neg,
|
||||
wpa_s->p2p_go_ht40);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
|||
const char *pin, enum p2p_wps_method wps_method,
|
||||
int persistent_group, int auto_join, int join,
|
||||
int auth, int go_intent, int freq, int persistent_id,
|
||||
int pd);
|
||||
int pd, int ht40);
|
||||
void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
|
||||
unsigned int freq, unsigned int duration);
|
||||
void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
|
||||
|
|
|
@ -2362,7 +2362,7 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
|
|||
{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, cli_cmd_flag_none,
|
||||
"= stop P2P Devices search" },
|
||||
{ "p2p_connect", wpa_cli_cmd_p2p_connect, cli_cmd_flag_none,
|
||||
"<addr> <\"pbc\"|PIN> = connect to a P2P Devices" },
|
||||
"<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
|
||||
{ "p2p_listen", wpa_cli_cmd_p2p_listen, cli_cmd_flag_none,
|
||||
"[timeout] = listen for P2P Devices for up-to timeout seconds" },
|
||||
{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove, cli_cmd_flag_none,
|
||||
|
|
|
@ -520,6 +520,7 @@ struct wpa_supplicant {
|
|||
unsigned int p2p_persistent_group:1;
|
||||
unsigned int p2p_fallback_to_go_neg:1;
|
||||
unsigned int p2p_pd_before_go_neg:1;
|
||||
unsigned int p2p_go_ht40:1;
|
||||
int p2p_persistent_id;
|
||||
int p2p_go_intent;
|
||||
int p2p_connect_freq;
|
||||
|
|
Loading…
Reference in a new issue