Merge branch 'fix/roam_issues_v6.1' into 'release/v6.1'

Send Low RSSI reason in BTM Query, blacklist recovery and unregister issue(v6.1)

See merge request espressif/esp-idf!52941
This commit is contained in:
Jiang Jiang Jian
2026-09-20 14:11:17 +08:00
2 changed files with 24 additions and 16 deletions

View File

@@ -33,6 +33,8 @@
#include "common/wpa_common.h"
#include "esp_wpas_glue.h"
#define BTM_QUERY_REASON_LOW_RSSI 16
static struct roaming_app g_roaming_app;
extern bool current_task_is_wifi_task(void);
@@ -608,8 +610,6 @@ static void roaming_app_set_disconnected_state(const wifi_event_sta_disconnected
g_roaming_app.current_bss.btm_support = false;
g_roaming_app.current_bss.rrm_support = false;
g_roaming_app.current_bss.ap.rssi = -128;
g_roaming_app.current_bss.ap.authmode = WIFI_AUTH_OPEN;
memset(g_roaming_app.current_bss.ap.ssid, 0, sizeof(g_roaming_app.current_bss.ap.ssid));
if (disconn) {
memcpy(g_roaming_app.current_bss.ap.bssid, disconn->bssid, ETH_ALEN);
@@ -1442,7 +1442,8 @@ static bool trigger_network_assisted_roam(struct cand_bss *bss)
btm_candidates = query_list;
}
if (esp_wnm_send_bss_transition_mgmt_query(REASON_RSSI, btm_candidates, 1) < 0) {
if (esp_wnm_send_bss_transition_mgmt_query((enum btm_query_reason)BTM_QUERY_REASON_LOW_RSSI,
btm_candidates, 1) < 0) {
ESP_LOGD(ROAMING_TAG, "failed to send btm query");
os_free(query_list);
return false;
@@ -2200,8 +2201,11 @@ void roam_init_app(void)
ESP_LOGE(ROAMING_TAG, "No roaming method enabled. Roaming app cannot be initialized");
return;
#endif
if (g_roaming_app.app_active) {
ESP_LOGD(ROAMING_TAG, "Roaming app already initialized");
return;
}
memset(&g_roaming_app, 0, sizeof(g_roaming_app));
g_roaming_app.app_active = true;
#if LOW_RSSI_ROAMING_ENABLED
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_BSS_RSSI_LOW,
&roaming_app_rssi_low_handler, NULL));
@@ -2212,6 +2216,7 @@ void roam_init_app(void)
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_NEIGHBOR_REP,
&roaming_app_neighbor_report_recv_handler, NULL));
#endif /*PERIODIC_RRM_MONITORING*/
g_roaming_app.app_active = true;
ESP_LOGI(ROAMING_TAG, "Roaming app initialization done");
}
@@ -2245,7 +2250,6 @@ static int roaming_app_deinit_internal(void *ctx, void *data)
{
(void) ctx;
(void) data;
g_roaming_app.app_active = false;
roaming_app_cancel_pending_events();
roaming_app_stop_periodic_monitors();
roaming_app_reset_connect_hint_state();
@@ -2287,6 +2291,7 @@ void roam_deinit_app(void)
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_NEIGHBOR_REP,
&roaming_app_neighbor_report_recv_handler));
#endif /*PERIODIC_RRM_MONITORING*/
g_roaming_app.app_active = false;
}
#if CONFIG_ESP_WIFI_ROAMING_BSSID_BLACKLIST

View File

@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -20,6 +20,8 @@
#include "esp_netif.h"
#include <sys/time.h>
#define BTM_QUERY_REASON_LOW_RSSI 16
/* Configuration */
#define EXAMPLE_WIFI_SSID CONFIG_EXAMPLE_WIFI_SSID
#define EXAMPLE_WIFI_PASSWORD CONFIG_EXAMPLE_WIFI_PASSWORD
@@ -344,18 +346,18 @@ static void esp_neighbor_report_recv_handler(void* arg, esp_event_base_t event_b
wifi_scan_config_t params;
memset(&params, 0, sizeof(wifi_scan_config_t));
if (esp_wifi_scan_start(&params, true) != ESP_OK) {
goto cleanup;
}
/* cleanup from net802.11 */
goto cleanup;
}
/* cleanup from net802.11 */
esp_wifi_clear_ap_list();
cand_list = 1;
}
/* send AP btm query, this will cause STA to roam as well */
esp_wnm_send_bss_transition_mgmt_query(REASON_FRAME_LOSS, neighbor_list, cand_list);
}
/* send AP btm query, this will cause STA to roam as well */
esp_wnm_send_bss_transition_mgmt_query(REASON_FRAME_LOSS, neighbor_list, cand_list);
cleanup:
if (neighbor_list)
free(neighbor_list);
if (neighbor_list) {
free(neighbor_list);
}
}
#if EXAMPLE_WIFI_RSSI_THRESHOLD
@@ -369,7 +371,8 @@ static void esp_bss_rssi_low_handler(void* arg, esp_event_base_t event_base,
if (esp_rrm_send_neighbor_report_request() < 0) {
/* failed to send neighbor report request */
ESP_LOGI(TAG, "failed to send neighbor report request");
if (esp_wnm_send_bss_transition_mgmt_query(REASON_FRAME_LOSS, NULL, 0) < 0) {
if (esp_wnm_send_bss_transition_mgmt_query((enum btm_query_reason)BTM_QUERY_REASON_LOW_RSSI,
NULL, 0) < 0) {
ESP_LOGI(TAG, "failed to send btm query");
}
} else {