mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
fix(esp_wifi): Stops roaming app upon application initiated disconnect
Stops roaming app when the application initiates a disconnect. Roaming app if enabled will be restarted when the station reconnects again.
This commit is contained in:
parent
e2ba2cfbe2
commit
6547315dde
@ -750,6 +750,33 @@ esp_err_t esp_nan_internal_datapath_resp(wifi_nan_datapath_resp_t *resp);
|
||||
*/
|
||||
esp_err_t esp_nan_internal_datapath_end(wifi_nan_datapath_end_req_t *req);
|
||||
|
||||
/**
|
||||
* @brief Connect WiFi station to the AP.
|
||||
*
|
||||
* @attention 1. This API only impact WIFI_MODE_STA or WIFI_MODE_APSTA mode
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: succeed
|
||||
* - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init
|
||||
* - ESP_ERR_WIFI_NOT_STARTED: WiFi is not started by esp_wifi_start
|
||||
* - ESP_ERR_WIFI_MODE: WiFi mode error
|
||||
* - ESP_ERR_WIFI_CONN: WiFi internal error, station or soft-AP control block wrong
|
||||
* - ESP_ERR_WIFI_SSID: SSID of AP which station connects is invalid
|
||||
*/
|
||||
esp_err_t esp_wifi_connect_internal(void);
|
||||
|
||||
/**
|
||||
* @brief Disconnect WiFi station from the AP.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: succeed
|
||||
* - ESP_ERR_WIFI_NOT_INIT: WiFi was not initialized by esp_wifi_init
|
||||
* - ESP_ERR_WIFI_NOT_STARTED: WiFi was not started by esp_wifi_start
|
||||
* - ESP_FAIL: other WiFi internal errors
|
||||
*
|
||||
*/
|
||||
esp_err_t esp_wifi_disconnect_internal(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit e809681ae309506087ca75d09028c1df4e42d9ba
|
||||
Subproject commit f78422a3cb497b8f73a3d35956cf31d677a4e08b
|
@ -38,6 +38,10 @@
|
||||
#include "esp_private/sleep_retention.h"
|
||||
#endif
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
#include "esp_roaming.h"
|
||||
#endif
|
||||
|
||||
static bool s_wifi_inited = false;
|
||||
|
||||
#if (CONFIG_ESP_WIFI_RX_BA_WIN > CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM)
|
||||
@ -176,6 +180,11 @@ static esp_err_t wifi_deinit_internal(void)
|
||||
#endif
|
||||
|
||||
esp_supplicant_deinit();
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
deinit_roaming_app();
|
||||
#endif
|
||||
|
||||
err = esp_wifi_deinit_internal();
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to deinit Wi-Fi driver (0x%x)", err);
|
||||
@ -435,6 +444,11 @@ esp_err_t esp_wifi_init(const wifi_init_config_t *config)
|
||||
ESP_LOGE(TAG, "Failed to init supplicant (0x%x)", result);
|
||||
goto _deinit;
|
||||
}
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
init_roaming_app();
|
||||
#endif
|
||||
|
||||
} else {
|
||||
goto _deinit;
|
||||
}
|
||||
@ -464,6 +478,28 @@ _deinit:
|
||||
return result;
|
||||
}
|
||||
|
||||
esp_err_t esp_wifi_connect(void)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
ret = esp_wifi_connect_internal();
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
roaming_app_enable_reconnect();
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t esp_wifi_disconnect(void)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
ret = esp_wifi_disconnect_internal();
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
roaming_app_disable_reconnect();
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_ENABLE
|
||||
void wifi_apb80m_request(void)
|
||||
{
|
||||
|
@ -112,6 +112,7 @@ struct roaming_app {
|
||||
#if PERIODIC_SCAN_MONITORING
|
||||
bool periodic_scan_active;
|
||||
#endif
|
||||
bool allow_reconnect;
|
||||
};
|
||||
|
||||
void init_roaming_app(void);
|
||||
@ -126,6 +127,9 @@ void roaming_app_periodic_scan_internal_handler(void *data, void *ctx);
|
||||
#endif /*PERIODIC_SCAN_ROAM_MONITORING*/
|
||||
|
||||
void roaming_app_trigger_roam_internal_handler(void *data, void *ctx);
|
||||
|
||||
void roaming_app_disable_reconnect(void);
|
||||
void roaming_app_enable_reconnect(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -50,6 +50,19 @@ static inline long time_diff_sec(struct timeval *a, struct timeval *b)
|
||||
{
|
||||
return (a->tv_sec - b->tv_sec);
|
||||
}
|
||||
|
||||
void roaming_app_disable_reconnect(void)
|
||||
{
|
||||
ESP_LOGD(ROAMING_TAG, "Switching off reconnect due to application trigerred disconnect");
|
||||
g_roaming_app.allow_reconnect = false;
|
||||
}
|
||||
|
||||
void roaming_app_enable_reconnect(void)
|
||||
{
|
||||
ESP_LOGD(ROAMING_TAG, "Switching on reconnect due to application trigerred reconnect");
|
||||
g_roaming_app.allow_reconnect = true;
|
||||
}
|
||||
|
||||
static void roaming_app_get_ap_info(wifi_ap_record_t *ap_info)
|
||||
{
|
||||
esp_wifi_sta_get_ap_info(ap_info);
|
||||
@ -145,6 +158,8 @@ static void roaming_app_disconnected_event_handler(void* arg, esp_event_base_t e
|
||||
ESP_LOGD(ROAMING_TAG, "station got disconnected reason=%d", disconn->reason);
|
||||
if (disconn->reason == WIFI_REASON_ROAMING) {
|
||||
ESP_LOGD(ROAMING_TAG, "station roaming, do nothing");
|
||||
} else if (g_roaming_app.allow_reconnect == false) {
|
||||
ESP_LOGD(ROAMING_TAG, "station initiated disconnect, do nothing");
|
||||
} else {
|
||||
#if LEGACY_ROAM_ENABLED
|
||||
/*
|
||||
@ -198,6 +213,7 @@ static void roaming_app_connected_event_handler(void* arg, esp_event_base_t even
|
||||
#if LEGACY_ROAM_ENABLED
|
||||
g_roaming_app.force_roam_ongoing = true;
|
||||
#endif /*LEGACY_ROAM_ENABLED*/
|
||||
g_roaming_app.allow_reconnect = true;
|
||||
}
|
||||
#define MAX_NEIGHBOR_LEN 512
|
||||
#if PERIODIC_RRM_MONITORING
|
||||
@ -475,8 +491,6 @@ static void periodic_rrm_request(struct timeval *now)
|
||||
g_roaming_app.rrm_request_active = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void periodic_rrm_request(struct timeval *now) { }
|
||||
#endif
|
||||
|
||||
static bool candidate_security_match(wifi_ap_record_t candidate)
|
||||
@ -763,7 +777,7 @@ esp_err_t init_scan_params(void)
|
||||
void init_roaming_app(void)
|
||||
{
|
||||
#if !LOW_RSSI_ROAMING_ENABLED && !PERIODIC_SCAN_MONITORING
|
||||
ESP_LOGE(ROAMING_TAG, "No roaming method enabled. Roaming app cannot be initialized");
|
||||
ESP_LOGE(ROAMING_TAG, "No roaming trigger enabled. Roaming app cannot be initialized");
|
||||
return;
|
||||
#endif
|
||||
|
||||
|
@ -427,9 +427,6 @@ void esp_supplicant_common_deinit(void)
|
||||
}
|
||||
s_supplicant_task_init_done = false;
|
||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
deinit_roaming_app();
|
||||
#endif
|
||||
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
|
||||
}
|
||||
|
||||
|
@ -481,6 +481,7 @@ int esp_supplicant_init(void)
|
||||
#ifdef CONFIG_OWE_STA
|
||||
esp_wifi_register_owe_cb(wpa_cb);
|
||||
#endif /* CONFIG_OWE_STA */
|
||||
|
||||
eloop_init();
|
||||
ret = esp_supplicant_common_init(wpa_cb);
|
||||
|
||||
@ -494,10 +495,6 @@ int esp_supplicant_init(void)
|
||||
ret = esp_wifi_internal_wapi_init();
|
||||
#endif
|
||||
|
||||
#if CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
|
||||
init_roaming_app();
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -43,8 +43,6 @@ static EventGroupHandle_t s_wifi_event_group;
|
||||
#define MAXIMUM_RETRY 5
|
||||
const char *TAG = "wifi roaming app";
|
||||
|
||||
static int s_retry_num = 0;
|
||||
|
||||
static void event_handler(void* arg, esp_event_base_t event_base,
|
||||
int32_t event_id, void* event_data)
|
||||
{
|
||||
@ -55,19 +53,12 @@ static void event_handler(void* arg, esp_event_base_t event_base,
|
||||
if (disconn->reason == WIFI_REASON_ROAMING) {
|
||||
ESP_LOGI(TAG, "station disconnected during roaming");
|
||||
} else {
|
||||
if (s_retry_num < MAXIMUM_RETRY) {
|
||||
ESP_LOGI(TAG, "station disconnected with reason %d", disconn->reason);
|
||||
esp_wifi_connect();
|
||||
s_retry_num++;
|
||||
ESP_LOGI(TAG, "retry to connect to the AP");
|
||||
} else {
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||
}
|
||||
ESP_LOGI(TAG, "station disconnected with reason %d", disconn->reason);
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||
}
|
||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
||||
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
|
||||
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
|
||||
s_retry_num = 0;
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user