diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index ea633a61a..6c67f9f2e 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -4185,6 +4185,7 @@ static const struct global_parse_data global_fields[] = { { INT(preassoc_mac_addr), 0 }, { INT(key_mgmt_offload), 0}, { INT(passive_scan), 0 }, + { INT(reassoc_same_bss_optim), 0 }, }; #undef FUNC diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index 2e5499402..afae78df8 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -1149,6 +1149,11 @@ struct wpa_config { * (scan_ssid=1) or P2P device discovery. */ int passive_scan; + + /** + * reassoc_same_bss_optim - Whether to optimize reassoc-to-same-BSS + */ + int reassoc_same_bss_optim; }; diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index 66d170c30..ecc57372a 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -1233,6 +1233,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config) if (config->passive_scan) fprintf(f, "passive_scan=%d\n", config->passive_scan); + + if (config->reassoc_same_bss_optim) + fprintf(f, "reassoc_same_bss_optim=%d\n", + config->reassoc_same_bss_optim); } #endif /* CONFIG_NO_CONFIG_WRITE */ diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index 6c0570722..178811371 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -207,6 +207,7 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, struct wpabuf *resp = NULL; u8 ext_capab[18]; int ext_capab_len; + int skip_auth; if (bss == NULL) { wpa_msg(wpa_s, MSG_ERROR, "SME: No scan result available for " @@ -215,6 +216,8 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, return; } + skip_auth = wpa_s->conf->reassoc_same_bss_optim && + wpa_s->reassoc_same_bss; wpa_s->current_bss = bss; os_memset(¶ms, 0, sizeof(params)); @@ -465,7 +468,7 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, sme_auth_handle_rrm(wpa_s, bss); #ifdef CONFIG_SAE - if (params.auth_alg == WPA_AUTH_ALG_SAE && + if (!skip_auth && params.auth_alg == WPA_AUTH_ALG_SAE && pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid, ssid, 0) == 0) { wpa_dbg(wpa_s, MSG_DEBUG, @@ -474,7 +477,7 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, wpa_s->sme.sae_pmksa_caching = 1; } - if (params.auth_alg == WPA_AUTH_ALG_SAE) { + if (!skip_auth && params.auth_alg == WPA_AUTH_ALG_SAE) { if (start) resp = sme_auth_build_sae_commit(wpa_s, ssid, bss->bssid); @@ -532,6 +535,15 @@ static void sme_send_authentication(struct wpa_supplicant *wpa_s, } #endif /* CONFIG_P2P */ + if (skip_auth) { + wpa_msg(wpa_s, MSG_DEBUG, + "SME: Skip authentication step on reassoc-to-same-BSS"); + wpabuf_free(resp); + sme_associate(wpa_s, ssid->mode, bss->bssid, WLAN_AUTH_OPEN); + return; + } + + wpa_s->sme.auth_alg = params.auth_alg; if (wpa_drv_authenticate(wpa_s, ¶ms) < 0) { wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the "