]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P2: Enable support for setting PMKSA in P2P Client mode
authorVinay Gannevaram <quic_vganneva@quicinc.com>
Wed, 16 Apr 2025 20:22:46 +0000 (01:52 +0530)
committerJouni Malinen <j@w1.fi>
Tue, 27 May 2025 20:50:53 +0000 (23:50 +0300)
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 <quic_vganneva@quicinc.com>
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index 2090dde0222b595ca8f04e104c9557365920ad6b..c2dc02c98e07e57060893b1ac87bcaeef842c803 100644 (file)
@@ -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;
index da7ff00c90edcf54a9455496f7ba8c1b613d1083..dfbd631639ad65da870e9d4679fe5e0dcb743d6c 100644 (file)
@@ -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)) {
index 1a7e2148e3bb3b932764b3f2a1cddab5408a360f..3f844aff672fb66cb76ce902512bb97fa971db3d 100644 (file)
@@ -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];