This is an automated email from the ASF dual-hosted git repository.
tmedicci pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new a1b9bedbe42 arch/[risc-v|xtensa]/espressif: reconnect Wi-Fi STA on
AP-side disconnect
a1b9bedbe42 is described below
commit a1b9bedbe42b76305d2d9e4272878ff3bd90ed92
Author: Felipe Moura <[email protected]>
AuthorDate: Thu Aug 6 15:22:05 2026 -0300
arch/[risc-v|xtensa]/espressif: reconnect Wi-Fi STA on AP-side disconnect
The disconnect handler only reconnects when the reported reason is
WIFI_REASON_ASSOC_LEAVE, so an AP-initiated deauth (beacon timeout, auth or
assoc expire) leaves the station down forever. Restore the intent flag the
driver used before 1f7c3a32e5 and 20ff68bd650, matching the ESP-IDF rule of
reconnecting unless the disconnection was requested locally.
Signed-off-by: Felipe Moura <[email protected]>
---
arch/risc-v/src/common/espressif/esp_wifi_api.c | 22 ++++++++++++++++++++++
arch/risc-v/src/common/espressif/esp_wifi_api.h | 12 ++++++++++++
.../src/common/espressif/esp_wifi_event_handler.c | 14 ++++----------
arch/xtensa/src/common/espressif/esp_wifi_api.c | 22 ++++++++++++++++++++++
arch/xtensa/src/common/espressif/esp_wifi_api.h | 12 ++++++++++++
.../src/common/espressif/esp_wifi_event_handler.c | 14 ++++----------
6 files changed, 76 insertions(+), 20 deletions(-)
diff --git a/arch/risc-v/src/common/espressif/esp_wifi_api.c
b/arch/risc-v/src/common/espressif/esp_wifi_api.c
index 5c2f6e611cc..3c60c3f3985 100644
--- a/arch/risc-v/src/common/espressif/esp_wifi_api.c
+++ b/arch/risc-v/src/common/espressif/esp_wifi_api.c
@@ -59,6 +59,18 @@
* Private Types
****************************************************************************/
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef ESP_WLAN_HAS_STA
+
+/* Whether the station should reconnect after an unsolicited disconnection */
+
+volatile bool g_sta_reconnect;
+
+#endif /* ESP_WLAN_HAS_STA */
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -527,6 +539,8 @@ int esp_wifi_sta_connect(void)
esp_wifi_lock(true);
+ g_sta_reconnect = true;
+
ret = esp_wifi_connect();
if (ret)
{
@@ -563,6 +577,12 @@ int esp_wifi_sta_disconnect(bool allow_reconnect)
wifi_config_t wifi_config;
esp_wifi_lock(true);
+
+ /* WARNING: failure_retry_cnt has no documented effect unless scan_method
+ * is WIFI_ALL_CHANNEL_SCAN, which NuttX never selects. Reconnection is
+ * gated by g_sta_reconnect.
+ */
+
esp_wifi_get_config(WIFI_IF_STA, &wifi_config);
if (allow_reconnect)
@@ -576,6 +596,8 @@ int esp_wifi_sta_disconnect(bool allow_reconnect)
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
+ g_sta_reconnect = allow_reconnect;
+
ret = esp_wifi_disconnect();
if (ret)
{
diff --git a/arch/risc-v/src/common/espressif/esp_wifi_api.h
b/arch/risc-v/src/common/espressif/esp_wifi_api.h
index ceb482670b4..43a4fb66e87 100644
--- a/arch/risc-v/src/common/espressif/esp_wifi_api.h
+++ b/arch/risc-v/src/common/espressif/esp_wifi_api.h
@@ -35,6 +35,18 @@
#include "esp_wlan_netdev.h"
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef ESP_WLAN_HAS_STA
+
+/* Whether the station should reconnect after an unsolicited disconnection */
+
+extern volatile bool g_sta_reconnect;
+
+#endif /* ESP_WLAN_HAS_STA */
+
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
diff --git a/arch/risc-v/src/common/espressif/esp_wifi_event_handler.c
b/arch/risc-v/src/common/espressif/esp_wifi_event_handler.c
index 67273a9c220..eb64138b551 100644
--- a/arch/risc-v/src/common/espressif/esp_wifi_event_handler.c
+++ b/arch/risc-v/src/common/espressif/esp_wifi_event_handler.c
@@ -86,11 +86,8 @@ static bool g_wifi_handler_registered;
* Name: esp_reconnect_work_cb
*
* Description:
- * Function called by a work queue to reconnect to Wi-Fi in case of
- * a disconnection event and WIFI_REASON_ASSOC_LEAVE reason.
- * Must check if the failure_retry_cnt is not 0, otherwise it may
- * reconnect when not desired, such as when the user has actually
- * asked to disconnect from the AP.
+ * Function called by a work queue to reconnect the Wi-Fi station after an
+ * unsolicited disconnection.
*
* Input Parameters:
* arg - Unused work queue argument.
@@ -104,12 +101,9 @@ static void esp_reconnect_work_cb(void *arg)
{
UNUSED(arg);
int ret;
- wifi_config_t wifi_config;
- esp_wifi_get_config(WIFI_IF_STA, &wifi_config);
- if (wifi_config.sta.failure_retry_cnt == 0)
+ if (!g_sta_reconnect)
{
- wlinfo("Reconnect to Wi-Fi on callback: failure_retry_cnt is 0\n");
return;
}
@@ -206,7 +200,7 @@ static void esp_wifi_event_handler(void *arg,
esp_event_base_t event_base,
wlinfo("Wi-Fi station disconnected, reason: %u\n", reason);
esp_wlan_sta_disconnect_hook();
- if (reason == WIFI_REASON_ASSOC_LEAVE)
+ if (g_sta_reconnect)
{
work_queue(LPWORK, &g_wifi_reconnect_work,
esp_reconnect_work_cb, NULL, 0);
diff --git a/arch/xtensa/src/common/espressif/esp_wifi_api.c
b/arch/xtensa/src/common/espressif/esp_wifi_api.c
index 8904a588789..b9486093995 100644
--- a/arch/xtensa/src/common/espressif/esp_wifi_api.c
+++ b/arch/xtensa/src/common/espressif/esp_wifi_api.c
@@ -59,6 +59,18 @@
* Private Types
****************************************************************************/
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef ESP_WLAN_HAS_STA
+
+/* Whether the station should reconnect after an unsolicited disconnection */
+
+volatile bool g_sta_reconnect;
+
+#endif /* ESP_WLAN_HAS_STA */
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -680,6 +692,8 @@ int esp_wifi_sta_connect(void)
esp_wifi_lock(true);
+ g_sta_reconnect = true;
+
ret = esp_wifi_connect();
if (ret != 0)
{
@@ -716,6 +730,12 @@ int esp_wifi_sta_disconnect(bool allow_reconnect)
wifi_config_t wifi_config;
esp_wifi_lock(true);
+
+ /* WARNING: failure_retry_cnt has no documented effect unless scan_method
+ * is WIFI_ALL_CHANNEL_SCAN, which NuttX never selects. Reconnection is
+ * gated by g_sta_reconnect.
+ */
+
esp_wifi_get_config(WIFI_IF_STA, &wifi_config);
if (allow_reconnect)
@@ -729,6 +749,8 @@ int esp_wifi_sta_disconnect(bool allow_reconnect)
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
+ g_sta_reconnect = allow_reconnect;
+
ret = esp_wifi_disconnect();
if (ret != 0)
{
diff --git a/arch/xtensa/src/common/espressif/esp_wifi_api.h
b/arch/xtensa/src/common/espressif/esp_wifi_api.h
index 6e57cc340bb..2b15405203c 100644
--- a/arch/xtensa/src/common/espressif/esp_wifi_api.h
+++ b/arch/xtensa/src/common/espressif/esp_wifi_api.h
@@ -35,6 +35,18 @@
#include "esp_wlan_netdev.h"
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef ESP_WLAN_HAS_STA
+
+/* Whether the station should reconnect after an unsolicited disconnection */
+
+extern volatile bool g_sta_reconnect;
+
+#endif /* ESP_WLAN_HAS_STA */
+
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
diff --git a/arch/xtensa/src/common/espressif/esp_wifi_event_handler.c
b/arch/xtensa/src/common/espressif/esp_wifi_event_handler.c
index 1e75b8554d5..4fee304e5c1 100644
--- a/arch/xtensa/src/common/espressif/esp_wifi_event_handler.c
+++ b/arch/xtensa/src/common/espressif/esp_wifi_event_handler.c
@@ -86,11 +86,8 @@ static bool g_wifi_handler_registered;
* Name: esp_reconnect_work_cb
*
* Description:
- * Function called by a work queue to reconnect to Wi-Fi in case of
- * a disconnection event and WIFI_REASON_ASSOC_LEAVE reason.
- * Must check if the failure_retry_cnt is not 0, otherwise it may
- * reconnect when not desired, such as when the user has actually
- * asked to disconnect from the AP.
+ * Function called by a work queue to reconnect the Wi-Fi station after an
+ * unsolicited disconnection.
*
* Input Parameters:
* arg - Unused work queue argument.
@@ -105,12 +102,9 @@ static void esp_reconnect_work_cb(void *arg)
{
UNUSED(arg);
int ret;
- wifi_config_t wifi_config;
- esp_wifi_get_config(WIFI_IF_STA, &wifi_config);
- if (wifi_config.sta.failure_retry_cnt == 0)
+ if (!g_sta_reconnect)
{
- wlinfo("Reconnect to Wi-Fi on callback: failure_retry_cnt is 0\n");
return;
}
@@ -202,7 +196,7 @@ static void esp_wifi_event_handler(void *arg,
esp_event_base_t event_base,
wlinfo("Wi-Fi station disconnected, reason: %u\n", reason);
esp_wlan_sta_disconnect_hook();
- if (reason == WIFI_REASON_ASSOC_LEAVE)
+ if (g_sta_reconnect)
{
work_queue(LPWORK, &g_wifi_reconnect_work,
esp_reconnect_work_cb, NULL, 0);