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:
Sarvesh Bodakhe
2026-03-08 14:52:36 +05:30
parent 7a6cff801f
commit 2a5ff3943f
@@ -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);
}