Skip to content

Commit

Permalink
Merge branch 'bugfix/softap_beacon_process_v4.4' into 'release/v4.4'
Browse files Browse the repository at this point in the history
esp_wifi: validate softAP interface when sending beacon and add sta_connected callback (Backport v4.4)

See merge request espressif/esp-idf!23255
  • Loading branch information
jack0c committed Apr 19, 2023
2 parents f87bdd4 + 9baec82 commit 5999775
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 49 deletions.
82 changes: 34 additions & 48 deletions components/wpa_supplicant/esp_supplicant/src/esp_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,44 +188,6 @@ static void register_action_frame(struct wpa_supplicant *wpa_s)
esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype);
}

static void supplicant_sta_conn_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
u8 bssid[ETH_ALEN];
u8 *ie;
struct wpa_supplicant *wpa_s = &g_wpa_supp;
int ret = esp_wifi_get_assoc_bssid_internal(bssid);
if (ret < 0) {
wpa_printf(MSG_ERROR, "Not able to get connected bssid");
return;
}
struct wpa_bss *bss = wpa_bss_get_bssid(wpa_s, bssid);
if (!bss) {
wpa_printf(MSG_INFO, "connected bss entry not present in scan cache");
return;
}
wpa_s->current_bss = bss;
ie = (u8 *)bss;
ie += sizeof(struct wpa_bss);
ieee802_11_parse_elems(wpa_s, ie, bss->ie_len);
wpa_bss_flush(wpa_s);
/* Register for action frames */
register_action_frame(wpa_s);
/* clear set bssid flag */
clear_bssid_flag(wpa_s);
}

static void supplicant_sta_disconn_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
struct wpa_supplicant *wpa_s = &g_wpa_supp;

wpas_rrm_reset(wpa_s);
if (wpa_s->current_bss) {
wpa_s->current_bss = NULL;
}
}

#endif /* defined(CONFIG_WPA_11KV_SUPPORT) */
static int ieee80211_handle_rx_frm(u8 type, u8 *frame, size_t len, u8 *sender,
u32 rssi, u8 channel, u64 current_tsf)
Expand Down Expand Up @@ -313,11 +275,6 @@ int esp_supplicant_common_init(struct wpa_funcs *wpa_cb)
esp_scan_init(wpa_s);
wpas_rrm_reset(wpa_s);
wpas_clear_beacon_rep_data(wpa_s);
esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_CONNECTED,
&supplicant_sta_conn_handler, NULL);
esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED,
&supplicant_sta_disconn_handler, NULL);

#endif /* defined(CONFIG_WPA_11KV_SUPPORT) */
wpa_s->type = 0;
wpa_s->subtype = 0;
Expand Down Expand Up @@ -350,11 +307,6 @@ void esp_supplicant_common_deinit(void)
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,
&supplicant_sta_conn_handler);
esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED,
&supplicant_sta_disconn_handler);
#endif /* defined(CONFIG_WPA_11KV_SUPPORT) */
if (wpa_s->type) {
wpa_s->type = 0;
Expand All @@ -375,6 +327,40 @@ void esp_supplicant_common_deinit(void)
#endif /* defined(CONFIG_WPA_11KV_SUPPORT) */
}

void supplicant_sta_conn_handler(uint8_t *bssid)
{
#if defined(CONFIG_WPA_11KV_SUPPORT)
u8 *ie;
struct wpa_supplicant *wpa_s = &g_wpa_supp;
struct wpa_bss *bss = wpa_bss_get_bssid(wpa_s, bssid);
if (!bss) {
wpa_printf(MSG_INFO, "connected bss entry not present in scan cache");
return;
}
wpa_s->current_bss = bss;
ie = (u8 *)bss;
ie += sizeof(struct wpa_bss);
ieee802_11_parse_elems(wpa_s, ie, bss->ie_len);
wpa_bss_flush(wpa_s);
/* Register for action frames */
register_action_frame(wpa_s);
/* clear set bssid flag */
clear_bssid_flag(wpa_s);
#endif /* defined(CONFIG_WPA_11KV_SUPPORT)*/
}

void supplicant_sta_disconn_handler(void)
{
#if defined(CONFIG_WPA_11KV_SUPPORT)
struct wpa_supplicant *wpa_s = &g_wpa_supp;

wpas_rrm_reset(wpa_s);
if (wpa_s->current_bss) {
wpa_s->current_bss = NULL;
}
#endif /* defined(CONFIG_WPA_11KV_SUPPORT) */
}

#if defined(CONFIG_WPA_11KV_SUPPORT)
bool esp_rrm_is_rrm_supported_connection(void)
{
Expand Down
2 changes: 2 additions & 0 deletions components/wpa_supplicant/esp_supplicant/src/esp_common_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,6 @@ static inline void esp_set_scan_ie(void) { }
int esp_supplicant_common_init(struct wpa_funcs *wpa_cb);
void esp_supplicant_common_deinit(void);
void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool add_mdie);
void supplicant_sta_conn_handler(uint8_t* bssid);
void supplicant_sta_disconn_handler(void);
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ struct wpa_funcs {
bool (*wpa_sta_init)(void);
bool (*wpa_sta_deinit)(void);
int (*wpa_sta_connect)(uint8_t *bssid);
void (*wpa_sta_connected_cb)(uint8_t *bssid);
void (*wpa_sta_disconnected_cb)(uint8_t reason_code);
int (*wpa_sta_rx_eapol)(u8 *src_addr, u8 *buf, u32 len);
bool (*wpa_sta_in_4way_handshake)(void);
Expand Down
7 changes: 7 additions & 0 deletions components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,11 @@ int wpa_parse_wpa_ie_wrapper(const u8 *wpa_ie, size_t wpa_ie_len, wifi_wpa_ie_t
return ret;
}

static void wpa_sta_connected_cb(uint8_t *bssid)
{
supplicant_sta_conn_handler(bssid);
}

static void wpa_sta_disconnected_cb(uint8_t reason_code)
{
switch (reason_code) {
Expand All @@ -225,6 +230,7 @@ static void wpa_sta_disconnected_cb(uint8_t reason_code)
default:
break;
}
supplicant_sta_disconn_handler();
}

int esp_supplicant_init(void)
Expand All @@ -240,6 +246,7 @@ int esp_supplicant_init(void)
wpa_cb->wpa_sta_deinit = wpa_deattach;
wpa_cb->wpa_sta_rx_eapol = wpa_sm_rx_eapol;
wpa_cb->wpa_sta_connect = wpa_sta_connect;
wpa_cb->wpa_sta_connected_cb = wpa_sta_connected_cb;
wpa_cb->wpa_sta_disconnected_cb = wpa_sta_disconnected_cb;
wpa_cb->wpa_sta_in_4way_handshake = wpa_sta_in_4way_handshake;

Expand Down

0 comments on commit 5999775

Please sign in to comment.