P2P: Add 802.11ax support for P2P GO
An optional parameter "he" is added to p2p_connect, p2p_group_add, and p2p_invite to enable 11ax HE support. The new p2p_go_he=1 configuration parameter can be used to request this to be enabled by default. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
9da1641a4c
commit
5a3319ab1b
12 changed files with 77 additions and 36 deletions
|
@ -103,6 +103,11 @@ struct p2p_go_neg_results {
|
||||||
|
|
||||||
unsigned int vht_center_freq2;
|
unsigned int vht_center_freq2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* he - Indicates if IEEE 802.11ax HE is enabled
|
||||||
|
*/
|
||||||
|
int he;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ssid - SSID of the group
|
* ssid - SSID of the group
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -150,7 +150,7 @@ join-a-group style PD instead of GO Negotiation style PD.
|
||||||
|
|
||||||
p2p_connect <peer device address> <pbc|pin|PIN#|p2ps> [display|keypad|p2ps]
|
p2p_connect <peer device address> <pbc|pin|PIN#|p2ps> [display|keypad|p2ps]
|
||||||
[persistent|persistent=<network id>] [join|auth]
|
[persistent|persistent=<network id>] [join|auth]
|
||||||
[go_intent=<0..15>] [freq=<in MHz>] [ht40] [vht] [provdisc] [auto]
|
[go_intent=<0..15>] [freq=<in MHz>] [ht40] [vht] [he] [provdisc] [auto]
|
||||||
[ssid=<hexdump>]
|
[ssid=<hexdump>]
|
||||||
|
|
||||||
Start P2P group formation with a discovered P2P peer. This includes
|
Start P2P group formation with a discovered P2P peer. This includes
|
||||||
|
@ -262,7 +262,7 @@ Parameters definition:
|
||||||
session_mac - Mandatory MAC address that owns/initiated the session
|
session_mac - Mandatory MAC address that owns/initiated the session
|
||||||
|
|
||||||
p2p_group_add [persistent|persistent=<network id>] [freq=<freq in MHz>]
|
p2p_group_add [persistent|persistent=<network id>] [freq=<freq in MHz>]
|
||||||
[ht40] [vht]
|
[ht40] [vht] [he]
|
||||||
|
|
||||||
Set up a P2P group owner manually (i.e., without group owner
|
Set up a P2P group owner manually (i.e., without group owner
|
||||||
negotiation with a specific peer). This is also known as autonomous
|
negotiation with a specific peer). This is also known as autonomous
|
||||||
|
@ -558,7 +558,7 @@ Remove all local services from internal SD query processing.
|
||||||
Invitation
|
Invitation
|
||||||
|
|
||||||
p2p_invite [persistent=<network id>|group=<group ifname>] [peer=address]
|
p2p_invite [persistent=<network id>|group=<group ifname>] [peer=address]
|
||||||
[go_dev_addr=address] [freq=<freq in MHz>] [ht40] [vht]
|
[go_dev_addr=address] [freq=<freq in MHz>] [ht40] [vht] [he]
|
||||||
[pref=<MHz>]
|
[pref=<MHz>]
|
||||||
|
|
||||||
Invite a peer to join a group (e.g., group=wlan1) or to reinvoke a
|
Invite a peer to join a group (e.g., group=wlan1) or to reinvoke a
|
||||||
|
|
|
@ -334,6 +334,9 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
|
||||||
list[8] = -1;
|
list[8] = -1;
|
||||||
}
|
}
|
||||||
conf->supported_rates = list;
|
conf->supported_rates = list;
|
||||||
|
#ifdef CONFIG_IEEE80211AX
|
||||||
|
conf->ieee80211ax = ssid->he;
|
||||||
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
}
|
}
|
||||||
|
|
||||||
bss->isolate = !wpa_s->conf->p2p_intra_bss;
|
bss->isolate = !wpa_s->conf->p2p_intra_bss;
|
||||||
|
|
|
@ -4760,6 +4760,7 @@ static const struct global_parse_data global_fields[] = {
|
||||||
{ INT_RANGE(p2p_optimize_listen_chan, 0, 1), 0 },
|
{ INT_RANGE(p2p_optimize_listen_chan, 0, 1), 0 },
|
||||||
{ INT(p2p_go_ht40), 0 },
|
{ INT(p2p_go_ht40), 0 },
|
||||||
{ INT(p2p_go_vht), 0 },
|
{ INT(p2p_go_vht), 0 },
|
||||||
|
{ INT(p2p_go_he), 0 },
|
||||||
{ INT(p2p_disabled), 0 },
|
{ INT(p2p_disabled), 0 },
|
||||||
{ INT_RANGE(p2p_go_ctwindow, 0, 127), 0 },
|
{ INT_RANGE(p2p_go_ctwindow, 0, 127), 0 },
|
||||||
{ INT(p2p_no_group_iface), 0 },
|
{ INT(p2p_no_group_iface), 0 },
|
||||||
|
|
|
@ -1078,6 +1078,16 @@ struct wpa_config {
|
||||||
*/
|
*/
|
||||||
int p2p_go_vht;
|
int p2p_go_vht;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* p2p_go_he - Default mode for 11ax HE enable when operating as GO
|
||||||
|
*
|
||||||
|
* This will take effect for p2p_group_add, p2p_connect, and p2p_invite.
|
||||||
|
* Note that regulatory constraints and driver capabilities are
|
||||||
|
* consulted anyway, so setting it to 1 can't do real harm.
|
||||||
|
* By default: 0 (disabled)
|
||||||
|
*/
|
||||||
|
int p2p_go_he;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* p2p_go_ctwindow - CTWindow to use when operating as GO
|
* p2p_go_ctwindow - CTWindow to use when operating as GO
|
||||||
*
|
*
|
||||||
|
|
|
@ -1261,6 +1261,8 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
|
||||||
fprintf(f, "p2p_go_ht40=%d\n", config->p2p_go_ht40);
|
fprintf(f, "p2p_go_ht40=%d\n", config->p2p_go_ht40);
|
||||||
if (config->p2p_go_vht)
|
if (config->p2p_go_vht)
|
||||||
fprintf(f, "p2p_go_vht=%d\n", config->p2p_go_vht);
|
fprintf(f, "p2p_go_vht=%d\n", config->p2p_go_vht);
|
||||||
|
if (config->p2p_go_he)
|
||||||
|
fprintf(f, "p2p_go_he=%d\n", config->p2p_go_he);
|
||||||
if (config->p2p_go_ctwindow != DEFAULT_P2P_GO_CTWINDOW)
|
if (config->p2p_go_ctwindow != DEFAULT_P2P_GO_CTWINDOW)
|
||||||
fprintf(f, "p2p_go_ctwindow=%d\n", config->p2p_go_ctwindow);
|
fprintf(f, "p2p_go_ctwindow=%d\n", config->p2p_go_ctwindow);
|
||||||
if (config->p2p_disabled)
|
if (config->p2p_disabled)
|
||||||
|
|
|
@ -519,6 +519,8 @@ struct wpa_ssid {
|
||||||
|
|
||||||
int vht;
|
int vht;
|
||||||
|
|
||||||
|
int he;
|
||||||
|
|
||||||
int max_oper_chwidth;
|
int max_oper_chwidth;
|
||||||
|
|
||||||
unsigned int vht_center_freq1;
|
unsigned int vht_center_freq1;
|
||||||
|
|
|
@ -5538,6 +5538,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
int ht40, vht, max_oper_chwidth, chwidth = 0, freq2 = 0;
|
int ht40, vht, max_oper_chwidth, chwidth = 0, freq2 = 0;
|
||||||
u8 _group_ssid[SSID_MAX_LEN], *group_ssid = NULL;
|
u8 _group_ssid[SSID_MAX_LEN], *group_ssid = NULL;
|
||||||
size_t group_ssid_len = 0;
|
size_t group_ssid_len = 0;
|
||||||
|
int he;
|
||||||
|
|
||||||
if (!wpa_s->global->p2p_init_wpa_s)
|
if (!wpa_s->global->p2p_init_wpa_s)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -5550,7 +5551,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
/* <addr> <"pbc" | "pin" | PIN> [label|display|keypad|p2ps]
|
/* <addr> <"pbc" | "pin" | PIN> [label|display|keypad|p2ps]
|
||||||
* [persistent|persistent=<network id>]
|
* [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] [vht] [auto] [ssid=<hexdump>] */
|
* [ht40] [vht] [he] [auto] [ssid=<hexdump>] */
|
||||||
|
|
||||||
if (hwaddr_aton(cmd, addr))
|
if (hwaddr_aton(cmd, addr))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -5581,6 +5582,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
vht = (os_strstr(cmd, " vht") != NULL) || wpa_s->conf->p2p_go_vht;
|
vht = (os_strstr(cmd, " vht") != NULL) || wpa_s->conf->p2p_go_vht;
|
||||||
ht40 = (os_strstr(cmd, " ht40") != NULL) || wpa_s->conf->p2p_go_ht40 ||
|
ht40 = (os_strstr(cmd, " ht40") != NULL) || wpa_s->conf->p2p_go_ht40 ||
|
||||||
vht;
|
vht;
|
||||||
|
he = (os_strstr(cmd, " he") != NULL) || wpa_s->conf->p2p_go_he;
|
||||||
|
|
||||||
pos2 = os_strstr(pos, " go_intent=");
|
pos2 = os_strstr(pos, " go_intent=");
|
||||||
if (pos2) {
|
if (pos2) {
|
||||||
|
@ -5651,7 +5653,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
|
new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
|
||||||
persistent_group, automatic, join,
|
persistent_group, automatic, join,
|
||||||
auth, go_intent, freq, freq2, persistent_id,
|
auth, go_intent, freq, freq2, persistent_id,
|
||||||
pd, ht40, vht, max_oper_chwidth,
|
pd, ht40, vht, max_oper_chwidth, he,
|
||||||
group_ssid, group_ssid_len);
|
group_ssid, group_ssid_len);
|
||||||
if (new_pin == -2) {
|
if (new_pin == -2) {
|
||||||
os_memcpy(buf, "FAIL-CHANNEL-UNAVAILABLE\n", 25);
|
os_memcpy(buf, "FAIL-CHANNEL-UNAVAILABLE\n", 25);
|
||||||
|
@ -6207,7 +6209,7 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
struct wpa_ssid *ssid;
|
struct wpa_ssid *ssid;
|
||||||
u8 *_peer = NULL, peer[ETH_ALEN];
|
u8 *_peer = NULL, peer[ETH_ALEN];
|
||||||
int freq = 0, pref_freq = 0;
|
int freq = 0, pref_freq = 0;
|
||||||
int ht40, vht, max_oper_chwidth, chwidth = 0, freq2 = 0;
|
int ht40, vht, he, max_oper_chwidth, chwidth = 0, freq2 = 0;
|
||||||
|
|
||||||
id = atoi(cmd);
|
id = atoi(cmd);
|
||||||
pos = os_strstr(cmd, " peer=");
|
pos = os_strstr(cmd, " peer=");
|
||||||
|
@ -6244,6 +6246,7 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
vht = (os_strstr(cmd, " vht") != NULL) || wpa_s->conf->p2p_go_vht;
|
vht = (os_strstr(cmd, " vht") != NULL) || wpa_s->conf->p2p_go_vht;
|
||||||
ht40 = (os_strstr(cmd, " ht40") != NULL) || wpa_s->conf->p2p_go_ht40 ||
|
ht40 = (os_strstr(cmd, " ht40") != NULL) || wpa_s->conf->p2p_go_ht40 ||
|
||||||
vht;
|
vht;
|
||||||
|
he = (os_strstr(cmd, " he") != NULL) || wpa_s->conf->p2p_go_he;
|
||||||
|
|
||||||
pos = os_strstr(cmd, "freq2=");
|
pos = os_strstr(cmd, "freq2=");
|
||||||
if (pos)
|
if (pos)
|
||||||
|
@ -6258,7 +6261,7 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return wpas_p2p_invite(wpa_s, _peer, ssid, NULL, freq, freq2, ht40, vht,
|
return wpas_p2p_invite(wpa_s, _peer, ssid, NULL, freq, freq2, ht40, vht,
|
||||||
max_oper_chwidth, pref_freq);
|
max_oper_chwidth, pref_freq, he);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6306,7 +6309,8 @@ static int p2p_ctrl_invite(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
|
|
||||||
static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s,
|
static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
int id, int freq, int vht_center_freq2,
|
int id, int freq, int vht_center_freq2,
|
||||||
int ht40, int vht, int vht_chwidth)
|
int ht40, int vht, int vht_chwidth,
|
||||||
|
int he)
|
||||||
{
|
{
|
||||||
struct wpa_ssid *ssid;
|
struct wpa_ssid *ssid;
|
||||||
|
|
||||||
|
@ -6320,7 +6324,7 @@ static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
|
|
||||||
return wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq,
|
return wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq,
|
||||||
vht_center_freq2, 0, ht40, vht,
|
vht_center_freq2, 0, ht40, vht,
|
||||||
vht_chwidth, NULL, 0, 0);
|
vht_chwidth, he, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6329,6 +6333,7 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
int freq = 0, persistent = 0, group_id = -1;
|
int freq = 0, persistent = 0, group_id = -1;
|
||||||
int vht = wpa_s->conf->p2p_go_vht;
|
int vht = wpa_s->conf->p2p_go_vht;
|
||||||
int ht40 = wpa_s->conf->p2p_go_ht40 || vht;
|
int ht40 = wpa_s->conf->p2p_go_ht40 || vht;
|
||||||
|
int he = wpa_s->conf->p2p_go_he;
|
||||||
int max_oper_chwidth, chwidth = 0, freq2 = 0;
|
int max_oper_chwidth, chwidth = 0, freq2 = 0;
|
||||||
char *token, *context = NULL;
|
char *token, *context = NULL;
|
||||||
#ifdef CONFIG_ACS
|
#ifdef CONFIG_ACS
|
||||||
|
@ -6351,6 +6356,8 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
} else if (os_strcmp(token, "vht") == 0) {
|
} else if (os_strcmp(token, "vht") == 0) {
|
||||||
vht = 1;
|
vht = 1;
|
||||||
ht40 = 1;
|
ht40 = 1;
|
||||||
|
} else if (os_strcmp(token, "he") == 0) {
|
||||||
|
he = 1;
|
||||||
} else if (os_strcmp(token, "persistent") == 0) {
|
} else if (os_strcmp(token, "persistent") == 0) {
|
||||||
persistent = 1;
|
persistent = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -6386,10 +6393,10 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
if (group_id >= 0)
|
if (group_id >= 0)
|
||||||
return p2p_ctrl_group_add_persistent(wpa_s, group_id,
|
return p2p_ctrl_group_add_persistent(wpa_s, group_id,
|
||||||
freq, freq2, ht40, vht,
|
freq, freq2, ht40, vht,
|
||||||
max_oper_chwidth);
|
max_oper_chwidth, he);
|
||||||
|
|
||||||
return wpas_p2p_group_add(wpa_s, persistent, freq, freq2, ht40, vht,
|
return wpas_p2p_group_add(wpa_s, persistent, freq, freq2, ht40, vht,
|
||||||
max_oper_chwidth);
|
max_oper_chwidth, he);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -384,14 +384,14 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message,
|
||||||
goto inv_args;
|
goto inv_args;
|
||||||
|
|
||||||
if (wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, 0, 0, 0,
|
if (wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, 0, 0, 0,
|
||||||
0, 0, NULL, 0, 0)) {
|
0, 0, 0, NULL, 0, 0)) {
|
||||||
reply = wpas_dbus_error_unknown_error(
|
reply = wpas_dbus_error_unknown_error(
|
||||||
message,
|
message,
|
||||||
"Failed to reinvoke a persistent group");
|
"Failed to reinvoke a persistent group");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} else if (wpas_p2p_group_add(wpa_s, persistent_group, freq, 0, 0, 0,
|
} else if (wpas_p2p_group_add(wpa_s, persistent_group, freq, 0, 0, 0,
|
||||||
0))
|
0, 0))
|
||||||
goto inv_args;
|
goto inv_args;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -604,7 +604,8 @@ DBusMessage * wpas_dbus_handler_p2p_connect(DBusMessage *message,
|
||||||
|
|
||||||
new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
|
new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
|
||||||
persistent_group, 0, join, authorize_only,
|
persistent_group, 0, join, authorize_only,
|
||||||
go_intent, freq, 0, -1, 0, 0, 0, 0, NULL, 0);
|
go_intent, freq, 0, -1, 0, 0, 0, 0, 0,
|
||||||
|
NULL, 0);
|
||||||
|
|
||||||
if (new_pin >= 0) {
|
if (new_pin >= 0) {
|
||||||
char npin[9];
|
char npin[9];
|
||||||
|
@ -761,7 +762,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (wpas_p2p_invite(wpa_s, peer_addr, ssid, NULL, 0, 0, 0, 0, 0,
|
if (wpas_p2p_invite(wpa_s, peer_addr, ssid, NULL, 0, 0, 0, 0, 0,
|
||||||
0) < 0) {
|
0, 0) < 0) {
|
||||||
reply = wpas_dbus_error_unknown_error(
|
reply = wpas_dbus_error_unknown_error(
|
||||||
message,
|
message,
|
||||||
"Failed to reinvoke a persistent group");
|
"Failed to reinvoke a persistent group");
|
||||||
|
|
|
@ -1912,6 +1912,7 @@ static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
|
||||||
ssid->vht = params->vht;
|
ssid->vht = params->vht;
|
||||||
ssid->max_oper_chwidth = params->max_oper_chwidth;
|
ssid->max_oper_chwidth = params->max_oper_chwidth;
|
||||||
ssid->vht_center_freq2 = params->vht_center_freq2;
|
ssid->vht_center_freq2 = params->vht_center_freq2;
|
||||||
|
ssid->he = params->he;
|
||||||
ssid->ssid = os_zalloc(params->ssid_len + 1);
|
ssid->ssid = os_zalloc(params->ssid_len + 1);
|
||||||
if (ssid->ssid) {
|
if (ssid->ssid) {
|
||||||
os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
|
os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
|
||||||
|
@ -3048,7 +3049,7 @@ static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
|
||||||
MAC2STR(sa), s->id);
|
MAC2STR(sa), s->id);
|
||||||
}
|
}
|
||||||
wpas_p2p_group_add_persistent(
|
wpas_p2p_group_add_persistent(
|
||||||
wpa_s, s, go, 0, op_freq, 0, 0, 0, 0, NULL,
|
wpa_s, s, go, 0, op_freq, 0, 0, 0, 0, 0, NULL,
|
||||||
go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0,
|
go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0,
|
||||||
1);
|
1);
|
||||||
} else if (bssid) {
|
} else if (bssid) {
|
||||||
|
@ -3274,6 +3275,7 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
|
||||||
wpa_s->p2p_go_vht_center_freq2,
|
wpa_s->p2p_go_vht_center_freq2,
|
||||||
wpa_s->p2p_go_ht40, wpa_s->p2p_go_vht,
|
wpa_s->p2p_go_ht40, wpa_s->p2p_go_vht,
|
||||||
wpa_s->p2p_go_max_oper_chwidth,
|
wpa_s->p2p_go_max_oper_chwidth,
|
||||||
|
wpa_s->p2p_go_he,
|
||||||
channels,
|
channels,
|
||||||
ssid->mode == WPAS_MODE_P2P_GO ?
|
ssid->mode == WPAS_MODE_P2P_GO ?
|
||||||
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
|
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
|
||||||
|
@ -4183,13 +4185,14 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev,
|
||||||
if (response_done && persistent_go) {
|
if (response_done && persistent_go) {
|
||||||
wpas_p2p_group_add_persistent(
|
wpas_p2p_group_add_persistent(
|
||||||
wpa_s, persistent_go,
|
wpa_s, persistent_go,
|
||||||
0, 0, freq, 0, 0, 0, 0, NULL,
|
0, 0, freq, 0, 0, 0, 0, 0, NULL,
|
||||||
persistent_go->mode ==
|
persistent_go->mode ==
|
||||||
WPAS_MODE_P2P_GO ?
|
WPAS_MODE_P2P_GO ?
|
||||||
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
|
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
|
||||||
0, 0);
|
0, 0);
|
||||||
} else if (response_done) {
|
} else if (response_done) {
|
||||||
wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0);
|
wpas_p2p_group_add(wpa_s, 1, freq,
|
||||||
|
0, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (passwd_id == DEV_PW_P2PS_DEFAULT) {
|
if (passwd_id == DEV_PW_P2PS_DEFAULT) {
|
||||||
|
@ -4305,11 +4308,11 @@ static int wpas_prov_disc_resp_cb(void *ctx)
|
||||||
|
|
||||||
if (persistent_go) {
|
if (persistent_go) {
|
||||||
wpas_p2p_group_add_persistent(
|
wpas_p2p_group_add_persistent(
|
||||||
wpa_s, persistent_go, 0, 0, 0, 0, 0, 0, 0, NULL,
|
wpa_s, persistent_go, 0, 0, 0, 0, 0, 0, 0, 0, NULL,
|
||||||
persistent_go->mode == WPAS_MODE_P2P_GO ?
|
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);
|
||||||
} else {
|
} else {
|
||||||
wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0);
|
wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -4832,6 +4835,7 @@ static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
|
||||||
wpa_s->p2p_go_ht40,
|
wpa_s->p2p_go_ht40,
|
||||||
wpa_s->p2p_go_vht,
|
wpa_s->p2p_go_vht,
|
||||||
wpa_s->p2p_go_max_oper_chwidth,
|
wpa_s->p2p_go_max_oper_chwidth,
|
||||||
|
wpa_s->p2p_go_he,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -5380,7 +5384,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
int persistent_group, int auto_join, int join, int auth,
|
int persistent_group, int auto_join, int join, int auth,
|
||||||
int go_intent, int freq, unsigned int vht_center_freq2,
|
int go_intent, int freq, unsigned int vht_center_freq2,
|
||||||
int persistent_id, int pd, int ht40, int vht,
|
int persistent_id, int pd, int ht40, int vht,
|
||||||
unsigned int vht_chwidth, const u8 *group_ssid,
|
unsigned int vht_chwidth, int he, const u8 *group_ssid,
|
||||||
size_t group_ssid_len)
|
size_t group_ssid_len)
|
||||||
{
|
{
|
||||||
int force_freq = 0, pref_freq = 0;
|
int force_freq = 0, pref_freq = 0;
|
||||||
|
@ -5425,6 +5429,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
wpa_s->p2p_go_vht = !!vht;
|
wpa_s->p2p_go_vht = !!vht;
|
||||||
wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
|
wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
|
||||||
wpa_s->p2p_go_max_oper_chwidth = vht_chwidth;
|
wpa_s->p2p_go_max_oper_chwidth = vht_chwidth;
|
||||||
|
wpa_s->p2p_go_he = !!he;
|
||||||
|
|
||||||
if (pin)
|
if (pin)
|
||||||
os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
|
os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
|
||||||
|
@ -5848,7 +5853,7 @@ static int wpas_same_band(int freq1, int freq2)
|
||||||
static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
||||||
struct p2p_go_neg_results *params,
|
struct p2p_go_neg_results *params,
|
||||||
int freq, int vht_center_freq2, int ht40,
|
int freq, int vht_center_freq2, int ht40,
|
||||||
int vht, int max_oper_chwidth,
|
int vht, int max_oper_chwidth, int he,
|
||||||
const struct p2p_channels *channels)
|
const struct p2p_channels *channels)
|
||||||
{
|
{
|
||||||
struct wpa_used_freq_data *freqs;
|
struct wpa_used_freq_data *freqs;
|
||||||
|
@ -5861,6 +5866,7 @@ static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
||||||
params->role_go = 1;
|
params->role_go = 1;
|
||||||
params->ht40 = ht40;
|
params->ht40 = ht40;
|
||||||
params->vht = vht;
|
params->vht = vht;
|
||||||
|
params->he = he;
|
||||||
params->max_oper_chwidth = max_oper_chwidth;
|
params->max_oper_chwidth = max_oper_chwidth;
|
||||||
params->vht_center_freq2 = vht_center_freq2;
|
params->vht_center_freq2 = vht_center_freq2;
|
||||||
|
|
||||||
|
@ -6217,7 +6223,7 @@ 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 wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
|
||||||
int freq, int vht_center_freq2, int ht40, int vht,
|
int freq, int vht_center_freq2, int ht40, int vht,
|
||||||
int max_oper_chwidth)
|
int max_oper_chwidth, int he)
|
||||||
{
|
{
|
||||||
struct p2p_go_neg_results params;
|
struct p2p_go_neg_results params;
|
||||||
|
|
||||||
|
@ -6238,7 +6244,7 @@ int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, vht_center_freq2,
|
if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, vht_center_freq2,
|
||||||
ht40, vht, max_oper_chwidth, NULL))
|
ht40, vht, max_oper_chwidth, he, NULL))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
p2p_go_params(wpa_s->global->p2p, ¶ms);
|
p2p_go_params(wpa_s->global->p2p, ¶ms);
|
||||||
|
@ -6317,7 +6323,7 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_ssid *ssid, int addr_allocated,
|
struct wpa_ssid *ssid, int addr_allocated,
|
||||||
int force_freq, int neg_freq,
|
int force_freq, int neg_freq,
|
||||||
int vht_center_freq2, int ht40,
|
int vht_center_freq2, int ht40,
|
||||||
int vht, int max_oper_chwidth,
|
int vht, int max_oper_chwidth, int he,
|
||||||
const struct p2p_channels *channels,
|
const struct p2p_channels *channels,
|
||||||
int connection_timeout, int force_scan)
|
int connection_timeout, int force_scan)
|
||||||
{
|
{
|
||||||
|
@ -6393,7 +6399,7 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, vht_center_freq2,
|
if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, vht_center_freq2,
|
||||||
ht40, vht, max_oper_chwidth, channels))
|
ht40, vht, max_oper_chwidth, he, channels))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
params.role_go = 1;
|
params.role_go = 1;
|
||||||
|
@ -6945,7 +6951,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,
|
int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
|
struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
|
||||||
int vht_center_freq2, int ht40, int vht, int max_chwidth,
|
int vht_center_freq2, int ht40, int vht, int max_chwidth,
|
||||||
int pref_freq)
|
int pref_freq, int he)
|
||||||
{
|
{
|
||||||
enum p2p_invite_role role;
|
enum p2p_invite_role role;
|
||||||
u8 *bssid = NULL;
|
u8 *bssid = NULL;
|
||||||
|
@ -6963,6 +6969,7 @@ int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
wpa_s->p2p_persistent_go_freq = freq;
|
wpa_s->p2p_persistent_go_freq = freq;
|
||||||
wpa_s->p2p_go_ht40 = !!ht40;
|
wpa_s->p2p_go_ht40 = !!ht40;
|
||||||
wpa_s->p2p_go_vht = !!vht;
|
wpa_s->p2p_go_vht = !!vht;
|
||||||
|
wpa_s->p2p_go_he = !!he;
|
||||||
wpa_s->p2p_go_max_oper_chwidth = max_chwidth;
|
wpa_s->p2p_go_max_oper_chwidth = max_chwidth;
|
||||||
wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
|
wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
|
||||||
if (ssid->mode == WPAS_MODE_P2P_GO) {
|
if (ssid->mode == WPAS_MODE_P2P_GO) {
|
||||||
|
@ -7985,7 +7992,8 @@ static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
|
||||||
wpa_s->p2p_pd_before_go_neg,
|
wpa_s->p2p_pd_before_go_neg,
|
||||||
wpa_s->p2p_go_ht40,
|
wpa_s->p2p_go_ht40,
|
||||||
wpa_s->p2p_go_vht,
|
wpa_s->p2p_go_vht,
|
||||||
wpa_s->p2p_go_max_oper_chwidth, NULL, 0);
|
wpa_s->p2p_go_max_oper_chwidth,
|
||||||
|
wpa_s->p2p_go_he, NULL, 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8521,6 +8529,7 @@ static int wpas_p2p_nfc_join_group(struct wpa_supplicant *wpa_s,
|
||||||
WPS_NFC, 0, 0, 1, 0, wpa_s->conf->p2p_go_intent,
|
WPS_NFC, 0, 0, 1, 0, wpa_s->conf->p2p_go_intent,
|
||||||
params->go_freq, wpa_s->p2p_go_vht_center_freq2,
|
params->go_freq, wpa_s->p2p_go_vht_center_freq2,
|
||||||
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
||||||
|
wpa_s->p2p_go_he,
|
||||||
params->go_ssid_len ? params->go_ssid : NULL,
|
params->go_ssid_len ? params->go_ssid : NULL,
|
||||||
params->go_ssid_len);
|
params->go_ssid_len);
|
||||||
}
|
}
|
||||||
|
@ -8600,7 +8609,7 @@ static int wpas_p2p_nfc_init_go_neg(struct wpa_supplicant *wpa_s,
|
||||||
WPS_NFC, 0, 0, 0, 0, wpa_s->conf->p2p_go_intent,
|
WPS_NFC, 0, 0, 0, 0, wpa_s->conf->p2p_go_intent,
|
||||||
forced_freq, wpa_s->p2p_go_vht_center_freq2,
|
forced_freq, wpa_s->p2p_go_vht_center_freq2,
|
||||||
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
||||||
NULL, 0);
|
wpa_s->p2p_go_he, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8616,7 +8625,7 @@ static int wpas_p2p_nfc_resp_go_neg(struct wpa_supplicant *wpa_s,
|
||||||
WPS_NFC, 0, 0, 0, 1, wpa_s->conf->p2p_go_intent,
|
WPS_NFC, 0, 0, 0, 1, wpa_s->conf->p2p_go_intent,
|
||||||
forced_freq, wpa_s->p2p_go_vht_center_freq2,
|
forced_freq, wpa_s->p2p_go_vht_center_freq2,
|
||||||
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
-1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
|
||||||
NULL, 0);
|
wpa_s->p2p_go_he, NULL, 0);
|
||||||
if (res)
|
if (res)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
@ -9001,7 +9010,7 @@ static int wpas_p2p_move_go_csa(struct wpa_supplicant *wpa_s)
|
||||||
* TODO: This function may not always work correctly. For example,
|
* TODO: This function may not always work correctly. For example,
|
||||||
* when we have a running GO and a BSS on a DFS channel.
|
* when we have a running GO and a BSS on a DFS channel.
|
||||||
*/
|
*/
|
||||||
if (wpas_p2p_init_go_params(wpa_s, ¶ms, 0, 0, 0, 0, 0, NULL)) {
|
if (wpas_p2p_init_go_params(wpa_s, ¶ms, 0, 0, 0, 0, 0, 0, NULL)) {
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG,
|
wpa_dbg(wpa_s, MSG_DEBUG,
|
||||||
"P2P CSA: Failed to select new frequency for GO");
|
"P2P CSA: Failed to select new frequency for GO");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -9113,7 +9122,7 @@ static void wpas_p2p_move_go_no_csa(struct wpa_supplicant *wpa_s)
|
||||||
wpa_supplicant_ap_deinit(wpa_s);
|
wpa_supplicant_ap_deinit(wpa_s);
|
||||||
|
|
||||||
/* Reselect the GO frequency */
|
/* Reselect the GO frequency */
|
||||||
if (wpas_p2p_init_go_params(wpa_s, ¶ms, 0, 0, 0, 0, 0, NULL)) {
|
if (wpas_p2p_init_go_params(wpa_s, ¶ms, 0, 0, 0, 0, 0, 0, NULL)) {
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Failed to reselect freq");
|
wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Failed to reselect freq");
|
||||||
wpas_p2p_group_delete(wpa_s,
|
wpas_p2p_group_delete(wpa_s,
|
||||||
P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL);
|
P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL);
|
||||||
|
|
|
@ -37,18 +37,18 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
int persistent_group, int auto_join, int join, int auth,
|
int persistent_group, int auto_join, int join, int auth,
|
||||||
int go_intent, int freq, unsigned int vht_center_freq2,
|
int go_intent, int freq, unsigned int vht_center_freq2,
|
||||||
int persistent_id, int pd, int ht40, int vht,
|
int persistent_id, int pd, int ht40, int vht,
|
||||||
unsigned int vht_chwidth, const u8 *group_ssid,
|
unsigned int vht_chwidth, int he, const u8 *group_ssid,
|
||||||
size_t group_ssid_len);
|
size_t group_ssid_len);
|
||||||
int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s,
|
int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s,
|
||||||
int freq, struct wpa_ssid *ssid);
|
int freq, struct wpa_ssid *ssid);
|
||||||
int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
|
int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
|
||||||
int freq, int vht_center_freq2, int ht40, int vht,
|
int freq, int vht_center_freq2, int ht40, int vht,
|
||||||
int max_oper_chwidth);
|
int max_oper_chwidth, int he);
|
||||||
int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
|
int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_ssid *ssid, int addr_allocated,
|
struct wpa_ssid *ssid, int addr_allocated,
|
||||||
int force_freq, int neg_freq,
|
int force_freq, int neg_freq,
|
||||||
int vht_center_freq2, int ht40,
|
int vht_center_freq2, int ht40,
|
||||||
int vht, int max_oper_chwidth,
|
int vht, int max_oper_chwidth, int he,
|
||||||
const struct p2p_channels *channels,
|
const struct p2p_channels *channels,
|
||||||
int connection_timeout, int force_scan);
|
int connection_timeout, int force_scan);
|
||||||
struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
|
struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
|
||||||
|
@ -117,7 +117,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,
|
int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
|
struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
|
||||||
int vht_center_freq2, int ht40, int vht,
|
int vht_center_freq2, int ht40, int vht,
|
||||||
int max_oper_chwidth, int pref_freq);
|
int max_oper_chwidth, int pref_freq, int he);
|
||||||
int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
|
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);
|
||||||
int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
|
int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
|
||||||
|
|
|
@ -918,6 +918,7 @@ struct wpa_supplicant {
|
||||||
unsigned int p2p_pd_before_go_neg:1;
|
unsigned int p2p_pd_before_go_neg:1;
|
||||||
unsigned int p2p_go_ht40:1;
|
unsigned int p2p_go_ht40:1;
|
||||||
unsigned int p2p_go_vht:1;
|
unsigned int p2p_go_vht:1;
|
||||||
|
unsigned int p2p_go_he:1;
|
||||||
unsigned int user_initiated_pd:1;
|
unsigned int user_initiated_pd:1;
|
||||||
unsigned int p2p_go_group_formation_completed:1;
|
unsigned int p2p_go_group_formation_completed:1;
|
||||||
unsigned int group_formation_reported:1;
|
unsigned int group_formation_reported:1;
|
||||||
|
|
Loading…
Reference in a new issue