Merge branch 'bugfix/wps_reconnect_failure' into 'master'

fix(wpa_suppplicant): Fix for issue in wps reconnection

Closes WIFI-6810, WIFIBUG-1086, and WIFIBUG-1067

See merge request espressif/esp-idf!37320
This commit is contained in:
Kapil Gupta
2025-03-10 22:26:42 +08:00
2 changed files with 8 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -877,9 +877,11 @@ int wps_finish(void)
return ret; return ret;
} }
/* This will get executed in the wifi task's context */
static void wps_sm_notify_deauth(void) static void wps_sm_notify_deauth(void)
{ {
if (gWpsSm && gWpsSm->wps->state != WPS_FINISHED) { if (gWpsSm && gWpsSm->wps->state != WPS_FINISHED &&
!gWpsSm->intermediate_disconnect) {
wps_stop_process(WPS_FAIL_REASON_RECV_DEAUTH); wps_stop_process(WPS_FAIL_REASON_RECV_DEAUTH);
} }
} }
@@ -1593,6 +1595,7 @@ wifi_station_wps_deinit(void)
sm->wps = NULL; sm->wps = NULL;
} }
if (s_wps_sm_cb) { if (s_wps_sm_cb) {
s_wps_sm_cb->wps_sm_notify_deauth = NULL;
os_free(s_wps_sm_cb); os_free(s_wps_sm_cb);
s_wps_sm_cb = NULL; s_wps_sm_cb = NULL;
} }
@@ -1643,7 +1646,9 @@ wifi_wps_scan_done(void *arg, ETS_STATUS status)
sm->discover_ssid_cnt = 0; sm->discover_ssid_cnt = 0;
if (wps_get_status() == WPS_STATUS_PENDING) { if (wps_get_status() == WPS_STATUS_PENDING) {
sm->intermediate_disconnect = true;
esp_wifi_disconnect(); esp_wifi_disconnect();
sm->intermediate_disconnect = false;
os_memcpy(wifi_config.sta.bssid, sm->bssid, ETH_ALEN); os_memcpy(wifi_config.sta.bssid, sm->bssid, ETH_ALEN);
os_memcpy(wifi_config.sta.ssid, (char *)sm->creds[0].ssid, sm->creds[0].ssid_len); os_memcpy(wifi_config.sta.ssid, (char *)sm->creds[0].ssid, sm->creds[0].ssid_len);

View File

@@ -84,6 +84,7 @@ struct wps_sm {
bool wps_pbc_overlap; bool wps_pbc_overlap;
struct discard_ap_list_t dis_ap_list[WPS_MAX_DIS_AP_NUM]; struct discard_ap_list_t dis_ap_list[WPS_MAX_DIS_AP_NUM];
u8 discard_ap_cnt; u8 discard_ap_cnt;
bool intermediate_disconnect;
}; };
#define API_MUTEX_TAKE() do {\ #define API_MUTEX_TAKE() do {\