mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
fix(wifi): ignore disconnect events outside WPS handshake phase in wps
wifi_station_wps_start() calls esp_wifi_disconnect() to leave a previously connected AP before scanning for WPS registrars. When the STA is already connected, the async disconnect event triggers wps_sm_notify_deauth() which incorrectly treats it as a handshake failure, disabling WPS entirely. Guard wps_handle_failure() so it only fires when wps_get_status() is WPS_STATUS_PENDING, i.e. the STA has found a WPS AP and is actively in the M1-M8 exchange.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -769,6 +769,15 @@ static void wps_sm_notify_deauth(void)
|
||||
return;
|
||||
}
|
||||
if (sm && sm->wps && sm->wps->state != WPS_FINISHED) {
|
||||
/* wifi_station_wps_start() calls esp_wifi_disconnect() to leave the
|
||||
* previously connected AP before scanning. That synchronous disconnect
|
||||
* callback must not be treated as a WPS handshake failure. Only act
|
||||
* on deauths received while actually negotiating (STATUS_PENDING). */
|
||||
if (wps_get_status() != WPS_STATUS_PENDING) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: Ignoring disconnect, not in WPS-handshake phase (status=%d)",
|
||||
wps_get_status());
|
||||
return;
|
||||
}
|
||||
wpa_printf(MSG_ERROR, "WPS: Deauthenticated during handshake");
|
||||
wps_handle_failure(WPS_FAIL_REASON_RECV_DEAUTH);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user