int id, int freq, int vht_center_freq2,
int ht40, int vht, int vht_chwidth,
int he, int edmg, bool allow_6ghz,
- const u8 *go_bssid)
+ const u8 *go_bssid, bool p2p2,
+ enum wpa_p2p_mode p2p_mode)
{
struct wpa_ssid *ssid;
+ bool join = false;
ssid = wpa_config_get_network(wpa_s->conf, id);
if (ssid == NULL || ssid->disabled != 2) {
return -1;
}
+ if (p2p2) {
+ wpa_s->p2p2 = p2p2;
+ wpa_s->p2p_mode = p2p_mode;
+ join = true;
+ }
return wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, freq,
vht_center_freq2, ht40, vht,
vht_chwidth, he, edmg,
NULL, 0, 0, allow_6ghz, 0,
- go_bssid, NULL, NULL, NULL, 0);
+ go_bssid, NULL, NULL, NULL, 0,
+ join);
}
int freq = 0, persistent = 0, group_id = -1;
bool p2p2 = false;
int p2pmode = WPA_P2P_MODE_WFD_R1;
+ enum wpa_p2p_mode p2p_mode;
bool allow_6ghz = false;
int vht = wpa_s->conf->p2p_go_vht;
int ht40 = wpa_s->conf->p2p_go_ht40 || vht;
wpa_s->p2p_go_allow_dfs = !!(wpa_s->drv_flags &
WPA_DRIVER_FLAGS_DFS_OFFLOAD);
+ if (p2pmode < WPA_P2P_MODE_WFD_R1 || p2pmode > WPA_P2P_MODE_WFD_PCC)
+ return -1;
+ p2p_mode = p2pmode;
+
if (group_id >= 0)
return p2p_ctrl_group_add_persistent(wpa_s, group_id,
freq, freq2, ht40, vht,
max_oper_chwidth, he,
edmg, allow_6ghz,
- go_bssid);
-
- if (p2pmode < WPA_P2P_MODE_WFD_R1 || p2pmode > WPA_P2P_MODE_WFD_PCC)
- return -1;
+ go_bssid, p2p2,
+ p2p_mode);
return wpas_p2p_group_add(wpa_s, persistent, freq, freq2, ht40, vht,
max_oper_chwidth, he, edmg, allow_6ghz, p2p2,
- (enum wpa_p2p_mode) p2pmode);
+ p2p_mode);
}
wpa_s->p2p_pmksa_entry = entry;
}
ssid->pmk_valid = true;
- } else if (res->akmp == WPA_KEY_MGMT_SAE && res->sae_password[0]) {
+ } else if ((res->akmp & WPA_KEY_MGMT_SAE) && res->sae_password[0]) {
ssid->auth_alg = WPA_AUTH_ALG_SAE;
ssid->sae_password = os_strdup(res->sae_password);
if (!ssid->sae_password)
ssid->psk_set = 1;
}
ssid->proto = WPA_PROTO_RSN;
- ssid->key_mgmt = WPA_KEY_MGMT_SAE;
+ if (wpa_s->p2p_mode == WPA_P2P_MODE_WFD_PCC)
+ ssid->key_mgmt = WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_PSK;
+ else
+ ssid->key_mgmt = WPA_KEY_MGMT_SAE;
ssid->pairwise_cipher = WPA_CIPHER_CCMP;
ssid->group_cipher = WPA_CIPHER_CCMP;
if (res->cipher)
wpa_s->conf->p2p_go_edmg, NULL,
go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0,
1, is_p2p_allow_6ghz(wpa_s->global->p2p), 0,
- bssid, sa, pmkid, pmk, pmk_len);
+ bssid, sa, pmkid, pmk, pmk_len, false);
} else if (bssid) {
wpa_s->user_initiated_pd = 0;
wpa_msg_global(wpa_s, MSG_INFO,
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
0, 1,
is_p2p_allow_6ghz(wpa_s->global->p2p), 0,
- bssid, peer, pmkid, pmk, pmk_len);
+ bssid, peer, pmkid, pmk, pmk_len, false);
}
WPAS_MODE_P2P_GO ?
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
0, 0, false, 0, NULL, NULL, NULL, NULL,
- 0);
+ 0, false);
} else if (response_done) {
wpas_p2p_group_add(wpa_s, 1, freq,
0, 0, 0, 0, 0, 0, false,
persistent_go->mode == WPAS_MODE_P2P_GO ?
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 0,
is_p2p_allow_6ghz(wpa_s->global->p2p), 0, NULL, NULL,
- NULL, NULL, 0);
+ NULL, NULL, 0, false);
} else {
wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0,
is_p2p_allow_6ghz(wpa_s->global->p2p),
iface_addr = wpa_s->pending_join_iface_addr;
if (wpa_s->pending_join_password[0]) {
- res.akmp = WPA_KEY_MGMT_SAE;
+ if (wpa_s->p2p_mode == WPA_P2P_MODE_WFD_PCC)
+ res.akmp = WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_PSK;
+ else
+ res.akmp = WPA_KEY_MGMT_SAE;
os_strlcpy(res.sae_password, wpa_s->pending_join_password,
sizeof(res.sae_password));
os_memset(wpa_s->pending_join_password, 0,
bool allow_6ghz, int retry_limit,
const u8 *go_bssid, const u8 *dev_addr,
const u8 *pmkid, const u8 *pmk,
- size_t pmk_len)
+ size_t pmk_len, bool join)
{
struct p2p_go_neg_results params;
int go = 0, freq;
}
} else if (ssid->mode == WPAS_MODE_INFRA) {
freq = neg_freq;
+
+ if (wpa_s->p2p2 && join) {
+ if (ssid->passphrase)
+ os_strlcpy(wpa_s->pending_join_password,
+ ssid->passphrase,
+ sizeof(wpa_s->pending_join_password));
+ return wpas_p2p_join_start(wpa_s, 0, ssid->ssid,
+ ssid->ssid_len);
+ }
+
if (freq <= 0 || !freq_included(wpa_s, channels, freq)) {
struct os_reltime now;
struct wpa_bss *bss =