With commit
3ab35a660364 ("Extend EAPOL frames processing workaround
for roaming cases") wpa_supplicant postpones EAPOL frame processing
till roam indication from the driver when the source address of EAPOL
frame does not match the current BSSID/AP MLD MAC address.
In driver-based SME, the FT roaming is handled at the driver/firmware.
However, when there is a deauth from the FT AP, the driver/firmware
attempts reassociation via full SAE to the same connected AP. In such
cases, the device offloads the EAPOL handling of FT AKMs to the
wpa_supplicant. If the M1 frame is received before the roamed event,
the wpa_supplicant treats this EAPOL frame as PTK rekey frame and
replies with the M2 frame. Roam event gets processed next(before M3)
which resets the temporary PTK derived from M1. Without this TPTK,
the MIC validation in M3 fails and leads to disconnection.
To fix this, extend the current EAPOL-defer logic to defer the
frames received after a successful external authentication to the
same AP until the roamed event is processed.
Signed-off-by: Surya Prakash Sivaraj <suryapra@qti.qualcomm.com>
wpabuf_free(wpa_s->pending_eapol_rx);
wpa_s->pending_eapol_rx = NULL;
+ wpa_s->ext_auth_to_same_bss = false;
}
}
wpa_s->last_eapol_matches_bssid = 0;
+ wpa_s->ext_auth_to_same_bss = false;
#ifdef CONFIG_TESTING_OPTIONS
if (wpa_s->rsne_override_eapol) {
wpa_s_clear_sae_rejected(wpa_s);
if (external) {
+ const u8 *connected_addr = wpa_s->valid_links ?
+ wpa_s->ap_mld_addr : wpa_s->bssid;
+ const u8 *src = wpa_s->sme.ext_ml_auth ?
+ wpa_s->sme.ext_auth_ap_mld_addr :
+ wpa_s->sme.ext_auth_bssid;
+
+ wpa_s->ext_auth_to_same_bss =
+ wpa_s->wpa_state > WPA_ASSOCIATED &&
+ ether_addr_equal(src, connected_addr);
+
/* Report success to driver */
sme_send_external_auth_status(wpa_s,
WLAN_STATUS_SUCCESS);
#endif /* CONFIG_TESTING_OPTIONS */
if (wpa_s->wpa_state < WPA_ASSOCIATED ||
+ wpa_s->ext_auth_to_same_bss ||
(wpa_s->last_eapol_matches_bssid &&
#ifdef CONFIG_AP
!wpa_s->ap_iface &&
unsigned int next_beacon_check;
bool scs_reconfigure;
+ bool ext_auth_to_same_bss; /* Whether external authentication has been
+ * completed successfully with the BSS that
+ * we are already associated with. */
};