diff --git a/components/wpa_supplicant/src/common/bss.c b/components/wpa_supplicant/src/common/bss.c index 247a5da833..241792c261 100644 --- a/components/wpa_supplicant/src/common/bss.c +++ b/components/wpa_supplicant/src/common/bss.c @@ -124,6 +124,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, @@ -132,6 +133,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 && (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 25dcb253e8..fed2843cc0 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_common.c +++ b/components/wpa_supplicant/src/esp_supplicant/esp_common.c @@ -177,7 +177,7 @@ static void esp_clear_bssid_flag(struct wpa_supplicant *wpa_s) static void esp_register_action_frame(struct wpa_supplicant *wpa_s) { - wpa_s->type &= ~WLAN_FC_STYPE_ACTION; + wpa_s->type &= ~(1 << WLAN_FC_STYPE_ACTION); /* subtype is defined only for action frame */ wpa_s->subtype = 0; @@ -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) { @@ -265,9 +281,7 @@ int esp_rrm_send_neighbor_rep_request(neighbor_rep_request_cb cb, struct wifi_ssid *ssid = esp_wifi_sta_get_prof_ssid_internal(); os_memcpy(wpa_ssid.ssid, ssid->ssid, ssid->len); wpa_ssid.ssid_len = ssid->len; - wpas_rrm_send_neighbor_rep_request(wpa_s, &wpa_ssid, 0, 0, cb, cb_ctx); - - return 0; + return wpas_rrm_send_neighbor_rep_request(wpa_s, &wpa_ssid, 0, 0, cb, cb_ctx); } int esp_wnm_send_bss_transition_mgmt_query(enum btm_query_reason query_reason, @@ -382,7 +396,9 @@ int esp_supplicant_post_evt(uint32_t evt_id, uint32_t data) os_free(evt); return -1; } - SUPPLICANT_API_UNLOCK(); + if (evt_id != SIG_SUPPLICANT_DEL_TASK) { + SUPPLICANT_API_UNLOCK(); + } return 0; } 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 8ad5467b6d..705e75b328 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, int 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,9 +86,7 @@ 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); } - /* Only do cleanup when scan is issued by supplicant */ - if (wpa_s->scan_reason == REASON_RRM_BEACON_REPORT || - wpa_s->scan_reason == REASON_WNM_BSS_TRANS_REQ) { + if (wpa_s->scanning) { esp_supp_scan_done_cleanup(wpa_s); } wpa_bss_update_end(wpa_s); @@ -111,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, @@ -199,7 +199,8 @@ static int esp_issue_scan(struct wpa_supplicant *wpa_s, params->ssid = os_zalloc(scan_params->ssids[0].ssid_len + 1); if (!params->ssid) { wpa_printf(MSG_ERROR, "failed to allocate memory"); - return -1; + ret = -1; + goto cleanup; } os_memcpy(params->ssid, scan_params->ssids[0].ssid, scan_params->ssids[0].ssid_len); params->scan_type = WIFI_SCAN_TYPE_ACTIVE; @@ -210,7 +211,8 @@ static int esp_issue_scan(struct wpa_supplicant *wpa_s, params->bssid = os_zalloc(ETH_ALEN); if (!params->bssid) { wpa_printf(MSG_ERROR, "failed to allocate memory"); - return -1; + ret = -1; + goto cleanup; } os_memcpy(params->bssid, scan_params->bssid, ETH_ALEN); } 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 c4e7bbacfb..b5fa8aa307 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h +++ b/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h @@ -133,6 +133,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 447578e94e..4a8fd55132 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c +++ b/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c @@ -74,15 +74,17 @@ void wpa_deauthenticate(u8 reason_code) esp_wifi_deauthenticate_internal(reason_code); } -void wpa_config_profile() +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()); } else if (esp_wifi_sta_prof_is_wpa2_internal() || esp_wifi_sta_prof_is_wpa3_internal()) { wpa_set_profile(WPA_PROTO_RSN, esp_wifi_sta_get_prof_authmode_internal()); } else { - WPA_ASSERT(0); + /* do nothing */ + return -1; } + return 0; } int wpa_config_bss(uint8_t *bssid) @@ -104,7 +106,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() @@ -158,11 +159,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) @@ -208,6 +217,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) @@ -237,6 +249,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); @@ -247,5 +261,6 @@ int esp_supplicant_init(void) int esp_supplicant_deinit(void) { + esp_supplicant_common_deinit(); return esp_wifi_unregister_wpa_cb_internal(); }