if (!pmksa->sm)
return;
+ if (pmksa->sm->driver_bss_selection) {
+ struct rsn_pmksa_cache_entry *entry;
+
+ entry = pmksa->sm->cur_pmksa ?
+ pmksa->sm->cur_pmksa :
+ pmksa_cache_get(pmksa, pmksa->sm->bssid, NULL, NULL,
+ NULL, 0);
+ if (entry && wpa_key_mgmt_sae(entry->akmp)) {
+ wpa_printf(MSG_DEBUG,
+ "RSN: remove reauth threshold passed PMKSA from the driver for SAE");
+ entry->sae_reauth_scheduled = true;
+ wpa_sm_remove_pmkid(pmksa->sm, entry->network_ctx,
+ entry->aa, entry->pmkid, NULL);
+ return;
+ }
+ }
+
pmksa->sm->cur_pmksa = NULL;
eapol_sm_request_reauth(pmksa->sm->eapol);
}
entry = pmksa->sm->cur_pmksa ? pmksa->sm->cur_pmksa :
pmksa_cache_get(pmksa, pmksa->sm->bssid, NULL, NULL, NULL, 0);
- if (entry && !wpa_key_mgmt_sae(entry->akmp)) {
+ if (entry &&
+ (!wpa_key_mgmt_sae(entry->akmp) ||
+ (pmksa->sm->driver_bss_selection &&
+ !entry->sae_reauth_scheduled))) {
sec = pmksa->pmksa->reauth_time - now.sec;
if (sec < 0)
sec = 0;
void wpa_sm_set_cur_pmksa(struct wpa_sm *sm,
struct rsn_pmksa_cache_entry *entry);
const u8 * wpa_sm_get_auth_addr(struct wpa_sm *sm);
+void wpa_sm_set_driver_bss_selection(struct wpa_sm *sm,
+ bool driver_bss_selection);
#endif /* WPA_H */
#ifdef CONFIG_PASN
wpa_pasn_sm_set_caps(wpa_s->wpa, wpa_s->drv_flags2);
#endif /* CONFIG_PASN */
+ wpa_sm_set_driver_bss_selection(wpa_s->wpa,
+ !!(wpa_s->drv_flags &
+ WPA_DRIVER_FLAGS_BSS_SELECTION));
if (wpa_s->max_remain_on_chan == 0)
wpa_s->max_remain_on_chan = 1000;