From 69a48e431e3e2313a4de229e660209f37851660b Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 25 May 2021 10:54:57 +0530 Subject: [PATCH] wpa_supplicant: Fix some issues in 11kv 1. RRM capability addition for open AP 2. Crash during scan flush 3. Station not able to connect if disassoc timer is present in BTM request 4. Memory leaks during wifi init/deinit. --- components/esp_wifi/lib | 2 +- components/wpa_supplicant/src/common/bss.c | 3 ++ .../wpa_supplicant/src/common/wnm_sta.c | 4 +++ .../src/esp_supplicant/esp_common.c | 16 ++++++++++ .../src/esp_supplicant/esp_common_i.h | 1 + .../src/esp_supplicant/esp_scan.c | 24 ++++++++------- .../src/esp_supplicant/esp_wifi_driver.h | 1 + .../src/esp_supplicant/esp_wpa_main.c | 29 ++++++++++++++----- 8 files changed, 62 insertions(+), 18 deletions(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index a53d875951..2f88f3fc9e 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit a53d875951c4ff0c8632c2fef26e9578d46ecaf7 +Subproject commit 2f88f3fc9ee4cf34687aff96d2721b23d1ec5726 diff --git a/components/wpa_supplicant/src/common/bss.c b/components/wpa_supplicant/src/common/bss.c index 88d8be4a81..6b6e199626 100644 --- a/components/wpa_supplicant/src/common/bss.c +++ b/components/wpa_supplicant/src/common/bss.c @@ -123,6 +123,7 @@ static int wpa_bss_in_use(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) if (bss == wpa_s->current_bss) return 1; +#ifndef ESP_SUPPLICANT if (wpa_s->current_bss && (bss->ssid_len != wpa_s->current_bss->ssid_len || os_memcmp(bss->ssid, wpa_s->current_bss->ssid, @@ -131,6 +132,8 @@ static int wpa_bss_in_use(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) return !is_zero_ether_addr(bss->bssid) && wpa_s->current_bss->bssid && (os_memcmp(bss->bssid, wpa_s->current_bss->bssid, ETH_ALEN) == 0); +#endif + return 0; } static int wpa_bss_remove_oldest_unknown(struct wpa_supplicant *wpa_s) diff --git a/components/wpa_supplicant/src/common/wnm_sta.c b/components/wpa_supplicant/src/common/wnm_sta.c index f238c206fe..84c25c8fe3 100644 --- a/components/wpa_supplicant/src/common/wnm_sta.c +++ b/components/wpa_supplicant/src/common/wnm_sta.c @@ -754,6 +754,10 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s, if (wpa_s->wnm_dissoc_timer) { /* TODO: mark current BSS less preferred for * selection */ +#ifdef ESP_SUPPLICANT + os_memset(wpa_s->next_scan_bssid, 0, ETH_ALEN); + wpa_s->next_scan_chan = 0; +#endif wpa_printf(MSG_DEBUG, "Trying to find another BSS"); wpa_supplicant_req_scan(wpa_s, 0, 0); } diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_common.c b/components/wpa_supplicant/src/esp_supplicant/esp_common.c index 27863b4ed1..74f42498fc 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_common.c +++ b/components/wpa_supplicant/src/esp_supplicant/esp_common.c @@ -257,6 +257,22 @@ void esp_supplicant_common_init(struct wpa_funcs *wpa_cb) wpa_cb->wpa_sta_rx_mgmt = esp_ieee80211_handle_rx_frm; } +void esp_supplicant_common_deinit(void) +{ + struct wpa_supplicant *wpa_s = &g_wpa_supp; + + if (esp_supplicant_post_evt(SIG_SUPPLICANT_DEL_TASK, 0) != 0) { + wpa_printf(MSG_ERROR, "failed to send task delete event"); + } + esp_scan_deinit(wpa_s); + wpas_rrm_reset(wpa_s); + wpas_clear_beacon_rep_data(wpa_s); + esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_CONNECTED, + &esp_supplicant_sta_conn_handler); + esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, + &esp_supplicant_sta_disconn_handler); +} + int esp_rrm_send_neighbor_rep_request(neighbor_rep_request_cb cb, void *cb_ctx) { diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_common_i.h b/components/wpa_supplicant/src/esp_supplicant/esp_common_i.h index 8d87d0774a..4dfe7e3d06 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_common_i.h +++ b/components/wpa_supplicant/src/esp_supplicant/esp_common_i.h @@ -52,6 +52,7 @@ int esp_ieee80211_handle_rx_frm(u8 type, u8 *frame, size_t len, u8 *sender, void esp_set_rm_enabled_ie(void); void esp_get_tx_power(uint8_t *tx_power); void esp_supplicant_common_init(struct wpa_funcs *wpa_cb); +void esp_supplicant_common_deinit(void); #else #include "esp_rrm.h" diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_scan.c b/components/wpa_supplicant/src/esp_supplicant/esp_scan.c index 0caf22e637..b63b52b9d7 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_scan.c +++ b/components/wpa_supplicant/src/esp_supplicant/esp_scan.c @@ -36,16 +36,14 @@ static void esp_scan_done_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { struct wpa_supplicant *wpa_s = &g_wpa_supp; - if (!wpa_s->scanning) { - /* update last scan time */ - wpa_s->scan_start_tsf = esp_wifi_get_tsf_time(WIFI_IF_STA); - wpa_printf(MSG_DEBUG, "scan not triggered by supplicant, ignore"); - return; - } - wpa_s->type &= ~(1 << WLAN_FC_STYPE_BEACON) & ~(1 << WLAN_FC_STYPE_PROBE_RESP); - esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype); - esp_supplicant_post_evt(SIG_SUPPLICANT_SCAN_DONE, 0); + /* update last scan time */ + wpa_s->scan_start_tsf = esp_wifi_get_tsf_time(WIFI_IF_STA); + if (!wpa_s->scanning) { + wpa_s->type &= ~(1 << WLAN_FC_STYPE_BEACON) & ~(1 << WLAN_FC_STYPE_PROBE_RESP); + esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype); + } + esp_supplicant_post_evt(SIG_SUPPLICANT_SCAN_DONE, 0); } static void esp_supp_handle_wnm_scan_done(struct wpa_supplicant *wpa_s) @@ -88,7 +86,9 @@ void esp_supplicant_handle_scan_done_evt(void) } else if (wpa_s->scan_reason == REASON_WNM_BSS_TRANS_REQ) { esp_supp_handle_wnm_scan_done(wpa_s); } - esp_supp_scan_done_cleanup(wpa_s); + if (wpa_s->scanning) { + esp_supp_scan_done_cleanup(wpa_s); + } wpa_bss_update_end(wpa_s); #ifndef SCAN_CACHE_SUPPORTED wpa_bss_flush(wpa_s); @@ -107,6 +107,10 @@ void esp_scan_init(struct wpa_supplicant *wpa_s) void esp_scan_deinit(struct wpa_supplicant *wpa_s) { wpa_bss_deinit(wpa_s); + os_free(wpa_s->last_scan_res); + wpa_s->last_scan_res = NULL; + esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_SCAN_DONE, + &esp_scan_done_event_handler); } int esp_handle_beacon_probe(u8 type, u8 *frame, size_t len, u8 *sender, diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h b/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h index 86e951e5f7..1c134c2371 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h +++ b/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h @@ -136,6 +136,7 @@ struct wpa_funcs { uint8_t *(*wpa3_build_sae_msg)(uint8_t *bssid, uint32_t type, size_t *len); int (*wpa3_parse_sae_msg)(uint8_t *buf, size_t len, uint32_t type, uint16_t status); int (*wpa_sta_rx_mgmt)(u8 type, u8 *frame, size_t len, u8 *sender, u32 rssi, u8 channel, u64 current_tsf); + void (*wpa_config_done)(void); }; struct wpa2_funcs { diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c b/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c index f2fad8643f..480ba919ff 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c +++ b/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c @@ -74,7 +74,7 @@ void wpa_deauthenticate(u8 reason_code) esp_wifi_deauthenticate_internal(reason_code); } -void wpa_config_profile(void) +int wpa_config_profile(void) { if (esp_wifi_sta_prof_is_wpa_internal()) { wpa_set_profile(WPA_PROTO_WPA, esp_wifi_sta_get_prof_authmode_internal()); @@ -83,8 +83,10 @@ void wpa_config_profile(void) } else if (esp_wifi_sta_prof_is_wapi_internal()) { wpa_set_profile(WPA_PROTO_WAPI, esp_wifi_sta_get_prof_authmode_internal()); } else { - WPA_ASSERT(0); + /* do nothing */ + return -1; } + return 0; } int wpa_config_bss(uint8_t *bssid) @@ -106,7 +108,6 @@ void wpa_config_assoc_ie(u8 proto, u8 *assoc_buf, u32 assoc_wpa_ie_len) } else { esp_wifi_set_appie_internal(WIFI_APPIE_RSN, assoc_buf, assoc_wpa_ie_len, 1); } - esp_set_rm_enabled_ie(); } void wpa_neg_complete(void) @@ -172,11 +173,19 @@ bool wpa_deattach(void) void wpa_sta_connect(uint8_t *bssid) { - + /* use this API to set AP specific IEs during connection */ int ret = 0; - wpa_config_profile(); - ret = wpa_config_bss(bssid); - WPA_ASSERT(ret == 0); + ret = wpa_config_profile(); + if (ret == 0) { + ret = wpa_config_bss(bssid); + WPA_ASSERT(ret == 0); + } +} + +void wpa_config_done(void) +{ + /* used in future for setting scan and assoc IEs */ + esp_set_rm_enabled_ie(); } int wpa_parse_wpa_ie_wrapper(const u8 *wpa_ie, size_t wpa_ie_len, wifi_wpa_ie_t *data) @@ -222,6 +231,9 @@ static inline void esp_supplicant_common_init(struct wpa_funcs *wpa_cb) { wpa_cb->wpa_sta_rx_mgmt = NULL; } +static inline void esp_supplicant_common_deinit(void) +{ +} #endif int esp_supplicant_init(void) @@ -253,6 +265,8 @@ int esp_supplicant_init(void) wpa_cb->wpa_parse_wpa_ie = wpa_parse_wpa_ie_wrapper; wpa_cb->wpa_config_bss = NULL;//wpa_config_bss; wpa_cb->wpa_michael_mic_failure = wpa_michael_mic_failure; + wpa_cb->wpa_config_done = wpa_config_done; + esp_wifi_register_wpa3_cb(wpa_cb); esp_supplicant_common_init(wpa_cb); @@ -267,5 +281,6 @@ int esp_supplicant_init(void) int esp_supplicant_deinit(void) { + esp_supplicant_common_deinit(); return esp_wifi_unregister_wpa_cb_internal(); }