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,
- NULL);
+ bssid, sa, pmkid, pmk, pmk_len);
} 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,
- NULL);
+ bssid, peer, pmkid, pmk, pmk_len);
}
persistent_go->mode ==
WPAS_MODE_P2P_GO ?
P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
- 0, 0, false, 0, NULL);
+ 0, 0, false, 0, NULL, NULL, NULL, NULL,
+ 0);
} else if (response_done) {
wpas_p2p_group_add(wpa_s, 1, freq,
0, 0, 0, 0, 0, 0, false);
NULL,
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);
+ is_p2p_allow_6ghz(wpa_s->global->p2p), 0, NULL, NULL,
+ NULL, NULL, 0);
} else {
wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0,
is_p2p_allow_6ghz(wpa_s->global->p2p));
static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
struct wpa_ssid *params, int addr_allocated,
int freq, int force_scan, int retry_limit,
- const u8 *go_bssid)
+ const u8 *go_bssid, bool p2p2, const u8 *pmkid,
+ const u8 *pmk, size_t pmk_len)
{
+ struct os_reltime now;
struct wpa_ssid *ssid;
int other_iface_found = 0;
struct wpa_supplicant *ifs;
+ struct rsn_pmksa_cache_entry *entry;
wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0);
if (wpa_s == NULL)
os_memcpy(ssid->bssid, go_bssid, ETH_ALEN);
}
+ if (p2p2) {
+ ssid->key_mgmt = WPA_KEY_MGMT_SAE;
+ ssid->auth_alg = WPA_AUTH_ALG_OPEN;
+ ssid->sae_pwe = SAE_PWE_HASH_TO_ELEMENT;
+ ssid->ieee80211w = MGMT_FRAME_PROTECTION_REQUIRED;
+ ssid->disabled = 0;
+
+ if (pmk && pmk_len && pmkid) {
+ entry = os_zalloc(sizeof(*entry));
+ if (!entry)
+ return -1;
+ os_memcpy(entry->aa, ssid->bssid, ETH_ALEN);
+ os_memcpy(entry->pmkid, pmkid, PMKID_LEN);
+ entry->pmk_len = pmk_len;
+ os_memcpy(entry->pmk, pmk, pmk_len);
+ entry->akmp = WPA_KEY_MGMT_SAE;
+ os_get_reltime(&now);
+ entry->expiration = now.sec + 43200;
+ entry->reauth_time = now.sec + 43200 * 70 / 100;
+ entry->network_ctx = ssid;
+ os_memcpy(entry->spa, wpa_s->own_addr, ETH_ALEN);
+
+ wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, entry);
+ ssid->pmk_valid = true;
+ }
+ wpa_s->current_ssid = ssid;
+ }
+
wpa_s->show_group_started = 1;
wpa_s->p2p_in_invitation = 1;
wpa_s->p2p_retry_limit = retry_limit;
const struct p2p_channels *channels,
int connection_timeout, int force_scan,
bool allow_6ghz, int retry_limit,
- const u8 *go_bssid)
+ const u8 *go_bssid, const u8 *dev_addr,
+ const u8 *pmkid, const u8 *pmk,
+ size_t pmk_len)
{
struct p2p_go_neg_results params;
int go = 0, freq;
}
return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq,
- force_scan, retry_limit, go_bssid);
+ force_scan, retry_limit, go_bssid,
+ wpa_s->p2p2, pmkid, pmk, pmk_len);
} else {
return -1;
}
params.ssid_len = ssid->ssid_len;
params.persistent_group = 1;
+ if (wpa_s->p2p2 && pmk_len && pmk && pmkid) {
+ os_memcpy(params.peer_device_addr, dev_addr, ETH_ALEN);
+ os_memcpy(params.pmkid, pmkid, PMKID_LEN);
+ os_memcpy(params.pmk, pmk, pmk_len);
+ params.pmk_len = pmk_len;
+ params.akmp = WPA_KEY_MGMT_SAE;
+ params.p2p2 = true;
+ }
+
wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1);
if (wpa_s == NULL)
return -1;