From: Vinay Gannevaram Date: Wed, 16 Apr 2025 20:22:46 +0000 (+0530) Subject: P2P2: Enable support for setting PMKSA in P2P Client mode X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05ab4a8d6978e4e20dc380591063f2fc71d1820d;p=thirdparty%2Fhostap.git P2P2: Enable support for setting PMKSA in P2P Client mode When a device does not support separate group interface creation for the group role, the existing P2P interface mode is switched from device mode to client mode before invoking wpa_driver_nl80211_connect(). Additionally, drivers only permit configuring PMKSA in P2P client mode. Therefore, PMKSA should be set in wpas_start_assoc_cb() for drivers that offload SME from wpa_supplicant. Signed-off-by: Vinay Gannevaram --- diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 2090dde02..c2dc02c98 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2073,7 +2073,12 @@ static void wpas_start_gc(struct wpa_supplicant *wpa_s, entry->network_ctx = ssid; os_memcpy(entry->spa, wpa_s->own_addr, ETH_ALEN); - wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, entry); + if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) { + wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, entry); + } else { + os_free(wpa_s->p2p_pmksa_entry); + wpa_s->p2p_pmksa_entry = entry; + } ssid->pmk_valid = true; } else if (res->akmp == WPA_KEY_MGMT_SAE && res->sae_password[0]) { ssid->auth_alg = WPA_AUTH_ALG_SAE; @@ -8169,7 +8174,12 @@ static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s, entry->network_ctx = ssid; os_memcpy(entry->spa, wpa_s->own_addr, ETH_ALEN); - wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, entry); + if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) { + wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, entry); + } else { + os_free(wpa_s->p2p_pmksa_entry); + wpa_s->p2p_pmksa_entry = entry; + } ssid->pmk_valid = true; } wpa_s->current_ssid = ssid; diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index da7ff00c9..dfbd63163 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -798,6 +798,11 @@ static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s) os_free(wpa_s->last_scan_res); wpa_s->last_scan_res = NULL; +#ifdef CONFIG_P2P + os_free(wpa_s->p2p_pmksa_entry); + wpa_s->p2p_pmksa_entry = NULL; +#endif /* CONFIG_P2P */ + #ifdef CONFIG_HS20 if (wpa_s->drv_priv) wpa_drv_configure_frame_filters(wpa_s, 0); @@ -4931,6 +4936,15 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit) wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0); } +#ifdef CONFIG_P2P + if (ssid->pmk_valid && wpa_s->p2p_pmksa_entry && + !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)) { + wpa_sm_pmksa_cache_add_entry(wpa_s->wpa, + wpa_s->p2p_pmksa_entry); + wpa_s->p2p_pmksa_entry = NULL; + } +#endif /* CONFIG_P2P */ + #ifdef CONFIG_WEP if (wep_keys_set && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) { diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 1a7e2148e..3f844aff6 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1093,6 +1093,7 @@ struct wpa_supplicant { #ifdef CONFIG_P2P struct p2p_go_neg_results *go_params; + struct rsn_pmksa_cache_entry *p2p_pmksa_entry; int create_p2p_iface; u8 pending_interface_addr[ETH_ALEN]; char pending_interface_name[100];