Merge branch 'bugfix/11kv_config_break' into 'master'

fix(esp_wifi): Correctly break 11kv config into wnm and rrm configs

Closes WIFIBUG-1065

See merge request espressif/esp-idf!37451
This commit is contained in:
Kapil Gupta 2025-03-05 18:28:26 +08:00
commit 3c7ca8f2c9
9 changed files with 60 additions and 41 deletions

View File

@ -559,7 +559,7 @@ menu "Wi-Fi"
config ESP_WIFI_RRM_SUPPORT config ESP_WIFI_RRM_SUPPORT
bool "Enable 802.11k APIs Support" bool "Enable 802.11k APIs Support"
depends on ESP_WIFI_11KV_SUPPORT depends on ESP_WIFI_11KV_SUPPORT
default n default y
help help
Select this option to enable 802.11k APIs(RRM support). Select this option to enable 802.11k APIs(RRM support).
Only APIs which are helpful for network assisted roaming Only APIs which are helpful for network assisted roaming
@ -574,7 +574,7 @@ menu "Wi-Fi"
config ESP_WIFI_WNM_SUPPORT config ESP_WIFI_WNM_SUPPORT
bool "Enable 802.11v APIs Support" bool "Enable 802.11v APIs Support"
depends on ESP_WIFI_11KV_SUPPORT depends on ESP_WIFI_11KV_SUPPORT
default n default y
help help
Select this option to enable 802.11v APIs(BTM support). Select this option to enable 802.11v APIs(BTM support).
Only APIs which are helpful for network assisted roaming Only APIs which are helpful for network assisted roaming
@ -606,7 +606,6 @@ menu "Wi-Fi"
bool "Advanced support for Wi-Fi Roaming (Experimental)" bool "Advanced support for Wi-Fi Roaming (Experimental)"
depends on IDF_EXPERIMENTAL_FEATURES depends on IDF_EXPERIMENTAL_FEATURES
default n default n
select ESP_WIFI_SCAN_CACHE
help help
Enable Espressif's roaming app to allow for efficient Wi-Fi roaming. Enable Espressif's roaming app to allow for efficient Wi-Fi roaming.
This includes configurable periodic environment scans, maintaining a cache of the This includes configurable periodic environment scans, maintaining a cache of the

View File

@ -66,10 +66,17 @@ extern "C" {
#endif #endif
/* Periodic RRM configuration */ /* Periodic RRM configuration */
#ifdef CONFIG_ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING
#define PERIODIC_RRM_MONITORING CONFIG_ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING #define PERIODIC_RRM_MONITORING CONFIG_ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING
#else
#define PERIODIC_RRM_MONITORING 0
#endif
#if PERIODIC_RRM_MONITORING #if PERIODIC_RRM_MONITORING
#define RRM_MONITOR_TIME CONFIG_ESP_WIFI_ROAMING_RRM_MONITOR_TIME #define RRM_MONITOR_TIME CONFIG_ESP_WIFI_ROAMING_RRM_MONITOR_TIME
#define RRM_MONITOR_RSSI_THRESHOLD CONFIG_ESP_WIFI_ROAMING_RRM_MONITOR_THRESHOLD #define RRM_MONITOR_RSSI_THRESHOLD CONFIG_ESP_WIFI_ROAMING_RRM_MONITOR_THRESHOLD
#else
#define RRM_MONITOR_TIME 232
#define RRM_MONITOR_RSSI_THRESHOLD -100
#endif /*PERIODIC_RRM_MONITORING*/ #endif /*PERIODIC_RRM_MONITORING*/
#define MAX_SCAN_CHAN_LIST_COUNT 14 #define MAX_SCAN_CHAN_LIST_COUNT 14

View File

@ -44,8 +44,12 @@ static void *neighbor_list_lock = NULL;
static int wifi_post_roam_event(struct cand_bss *bss); static int wifi_post_roam_event(struct cand_bss *bss);
static void determine_best_ap(int8_t rssi_threshold); static void determine_best_ap(int8_t rssi_threshold);
#if PERIODIC_RRM_MONITORING
static void roaming_app_periodic_rrm_internal_handler(void *data, void *ctx); static void roaming_app_periodic_rrm_internal_handler(void *data, void *ctx);
#endif
#if PERIODIC_SCAN_MONITORING
static void roaming_app_periodic_scan_internal_handler(void *data, void *ctx); static void roaming_app_periodic_scan_internal_handler(void *data, void *ctx);
#endif
static const char *ROAMING_TAG = "ROAM"; static const char *ROAMING_TAG = "ROAM";

View File

@ -295,7 +295,7 @@ if(CONFIG_ESP_WIFI_DPP_SUPPORT)
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_DPP) target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_DPP)
endif() endif()
if(CONFIG_ESP_WIFI_11KV_SUPPORT) if(CONFIG_ESP_WIFI_11KV_SUPPORT)
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_WNM CONFIG_RRM CONFIG_IEEE80211KV) target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_IEEE80211KV)
endif() endif()
if(CONFIG_ESP_WIFI_RRM_SUPPORT) if(CONFIG_ESP_WIFI_RRM_SUPPORT)
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_RRM) target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_RRM)

View File

@ -36,8 +36,7 @@ esp_err_t esp_supplicant_str_to_mac(const char *str, uint8_t dest[6])
struct wpa_supplicant g_wpa_supp; struct wpa_supplicant g_wpa_supp;
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) #ifdef CONFIG_RRM
#if defined(CONFIG_RRM)
static void handle_rrm_frame(struct wpa_supplicant *wpa_s, u8 *sender, static void handle_rrm_frame(struct wpa_supplicant *wpa_s, u8 *sender,
u8 *payload, size_t len, int8_t rssi) u8 *payload, size_t len, int8_t rssi)
{ {
@ -56,8 +55,10 @@ static void handle_rrm_frame(struct wpa_supplicant *wpa_s, u8 *sender,
} }
#endif /* CONFIG_RRM */ #endif /* CONFIG_RRM */
#if defined(CONFIG_IEEE80211KV)
static int mgmt_rx_action(u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 channel) static int mgmt_rx_action(u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 channel)
{ {
#if defined(CONFIG_RRM) || defined(CONFIG_WNM)
u8 category; u8 category;
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
struct wpa_supplicant *wpa_s = &g_wpa_supp; struct wpa_supplicant *wpa_s = &g_wpa_supp;
@ -80,11 +81,13 @@ static int mgmt_rx_action(u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 cha
handle_rrm_frame(wpa_s, sender, frame, len, rssi); handle_rrm_frame(wpa_s, sender, frame, len, rssi);
} }
#endif /* CONFIG_RRM */ #endif /* CONFIG_RRM */
#endif /* defined(CONFIG_RRM) || defined(CONFIG_WNM) */
return 0; return 0;
} }
static void clear_bssid_flag_and_channel(struct wpa_supplicant *wpa_s) static void clear_bssid_flag_and_channel(struct wpa_supplicant *wpa_s)
{ {
#if defined(CONFIG_WNM)
wifi_config_t *config; wifi_config_t *config;
/* Reset only if btm is enabled */ /* Reset only if btm is enabled */
@ -107,8 +110,11 @@ static void clear_bssid_flag_and_channel(struct wpa_supplicant *wpa_s)
} }
os_free(config); os_free(config);
wpa_printf(MSG_DEBUG, "cleared bssid flag"); wpa_printf(MSG_DEBUG, "cleared bssid flag");
#endif /* CONFIG_WNM */
} }
#endif /* CONFIG_IEEE80211KV */
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
static void register_mgmt_frames(struct wpa_supplicant *wpa_s) static void register_mgmt_frames(struct wpa_supplicant *wpa_s)
{ {
wpa_s->type &= ~(1 << WLAN_FC_STYPE_ACTION); wpa_s->type &= ~(1 << WLAN_FC_STYPE_ACTION);
@ -139,6 +145,7 @@ static void register_mgmt_frames(struct wpa_supplicant *wpa_s)
#endif /* CONFIG_IEEE80211R */ #endif /* CONFIG_IEEE80211R */
esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype); esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype);
} }
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
static int handle_auth_frame(u8 *frame, size_t len, static int handle_auth_frame(u8 *frame, size_t len,
@ -171,7 +178,7 @@ static int handle_assoc_frame(u8 *frame, size_t len,
return 0; return 0;
} }
static void wpa_sta_clear_ft_auth_ie(void) void wpa_sta_clear_ft_auth_ie(void)
{ {
struct wpa_sm *sm = &gWpaSm; struct wpa_sm *sm = &gWpaSm;
wpa_printf(MSG_DEBUG, "Clearing all FT IE parameters and keys"); wpa_printf(MSG_DEBUG, "Clearing all FT IE parameters and keys");
@ -184,7 +191,6 @@ static void wpa_sta_clear_ft_auth_ie(void)
wpa_sm_drop_sa(sm); wpa_sm_drop_sa(sm);
} }
#endif /* CONFIG_IEEE80211R */ #endif /* CONFIG_IEEE80211R */
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
void esp_supplicant_unset_all_appie(void) void esp_supplicant_unset_all_appie(void)
{ {
@ -335,8 +341,7 @@ void supplicant_sta_conn_handler(uint8_t *bssid)
void supplicant_sta_disconn_handler(uint8_t reason_code) void supplicant_sta_disconn_handler(uint8_t reason_code)
{ {
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) #if defined(CONFIG_IEEE80211KV)
struct wpa_sm *sm = &gWpaSm;
struct wpa_supplicant *wpa_s = &g_wpa_supp; struct wpa_supplicant *wpa_s = &g_wpa_supp;
#if defined(CONFIG_RRM) #if defined(CONFIG_RRM)
@ -352,16 +357,9 @@ void supplicant_sta_disconn_handler(uint8_t reason_code)
if (wpa_s->current_bss) { if (wpa_s->current_bss) {
wpa_s->current_bss = NULL; wpa_s->current_bss = NULL;
} }
#if defined(CONFIG_IEEE80211R) #endif /* defined(CONFIG_IEEE80211KV) */
if (!sm->cur_pmksa) {
/* clear all ft auth related IEs so that next will be open auth */
wpa_sta_clear_ft_auth_ie();
}
#endif
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
} }
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
#if defined(CONFIG_RRM) #if defined(CONFIG_RRM)
bool esp_rrm_is_rrm_supported_connection(void) bool esp_rrm_is_rrm_supported_connection(void)
{ {
@ -478,8 +476,8 @@ static size_t get_rm_enabled_ie(uint8_t *ie, size_t len)
return rrm_ie_len + 2; return rrm_ie_len + 2;
} }
#endif /* defined(CONFIG_RRM) */ #endif /* defined(CONFIG_RRM) */
#if defined(CONFIG_WNM) #if defined(CONFIG_WNM)
bool esp_wnm_is_btm_supported_connection(void) bool esp_wnm_is_btm_supported_connection(void)
{ {
@ -633,9 +631,9 @@ void wpa_supplicant_connect(struct wpa_supplicant *wpa_s,
esp_wifi_connect(); esp_wifi_connect();
} }
#if defined(CONFIG_WNM) || defined(CONFIG_MBO)
void esp_set_scan_ie(void) void esp_set_scan_ie(void)
{ {
#ifdef CONFIG_WNM
#define SCAN_IE_LEN 64 #define SCAN_IE_LEN 64
uint8_t *ie, *pos; uint8_t *ie, *pos;
size_t len = SCAN_IE_LEN, ie_len; size_t len = SCAN_IE_LEN, ie_len;
@ -646,20 +644,24 @@ void esp_set_scan_ie(void)
return; return;
} }
pos = ie; pos = ie;
#ifdef CONFIG_WNM
ie_len = get_extended_caps_ie(pos, len); ie_len = get_extended_caps_ie(pos, len);
pos += ie_len; pos += ie_len;
len -= ie_len; len -= ie_len;
#endif /* defined(CONFIG_WNM) */
#ifdef CONFIG_MBO #ifdef CONFIG_MBO
ie_len = get_mbo_oce_scan_ie(pos, len); ie_len = get_mbo_oce_scan_ie(pos, len);
pos += ie_len; pos += ie_len;
len -= ie_len; len -= ie_len;
#endif /* CONFIG_MBO */ #endif /* CONFIG_MBO */
esp_wifi_unset_appie_internal(WIFI_APPIE_PROBEREQ); if (SCAN_IE_LEN - len) {
esp_wifi_set_appie_internal(WIFI_APPIE_PROBEREQ, ie, SCAN_IE_LEN - len, 0); esp_wifi_unset_appie_internal(WIFI_APPIE_PROBEREQ);
esp_wifi_set_appie_internal(WIFI_APPIE_PROBEREQ, ie, SCAN_IE_LEN - len, 0);
}
os_free(ie); os_free(ie);
#undef SCAN_IE_LEN #undef SCAN_IE_LEN
#endif /* defined(CONFIG_WNM) */
} }
#endif /* defined(CONFIG_WNM) || defined(CONFIG_MBO) */
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
static size_t add_mdie(uint8_t *bssid, uint8_t *ie, size_t len) static size_t add_mdie(uint8_t *bssid, uint8_t *ie, size_t len)
@ -762,15 +764,22 @@ int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
return ret; return ret;
} }
#else /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */ #ifndef CONFIG_WNM
void esp_set_scan_ie(void) { } void esp_set_scan_ie(void) { }
bool esp_wnm_is_btm_supported_connection(void)
bool esp_rrm_is_rrm_supported_connection(void)
{ {
return false; return false;
} }
int esp_wnm_send_bss_transition_mgmt_query(enum btm_query_reason query_reason,
const char *btm_candidates,
int cand_list)
{
return -1;
}
#endif
bool esp_wnm_is_btm_supported_connection(void) #ifndef CONFIG_RRM
bool esp_rrm_is_rrm_supported_connection(void)
{ {
return false; return false;
} }
@ -785,22 +794,15 @@ int esp_rrm_send_neighbor_rep_request(neighbor_rep_request_cb cb,
{ {
return -1; return -1;
} }
int esp_wnm_send_bss_transition_mgmt_query(enum btm_query_reason query_reason, #endif
const char *btm_candidates,
int cand_list)
{
return -1;
}
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */ #if defined(CONFIG_RRM) || defined(CONFIG_IEEE80211R) || defined(CONFIG_WPA3_SAE)
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) || defined(CONFIG_WPA3_SAE)
void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie) void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie)
{ {
#define ASSOC_IE_LEN 128 #define ASSOC_IE_LEN 128
uint8_t *ie, *pos; uint8_t *ie, *pos;
size_t len = ASSOC_IE_LEN; size_t len = ASSOC_IE_LEN;
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) #if defined(CONFIG_RRM) || defined(CONFIG_IEEE80211R)
size_t ie_len; size_t ie_len;
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */ #endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
ie = os_malloc(ASSOC_IE_LEN + ies_len); ie = os_malloc(ASSOC_IE_LEN + ies_len);
@ -813,6 +815,7 @@ void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie)
ie_len = get_rm_enabled_ie(pos, len); ie_len = get_rm_enabled_ie(pos, len);
pos += ie_len; pos += ie_len;
len -= ie_len; len -= ie_len;
#endif /* defined(CONFIG_RRM) */
#ifdef CONFIG_MBO #ifdef CONFIG_MBO
ie_len = get_operating_class_ie(pos, len); ie_len = get_operating_class_ie(pos, len);
pos += ie_len; pos += ie_len;
@ -821,7 +824,6 @@ void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie)
pos += ie_len; pos += ie_len;
len -= ie_len; len -= ie_len;
#endif /* CONFIG_MBO */ #endif /* CONFIG_MBO */
#endif /* defined(CONFIG_RRM) */
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
if (mdie) { if (mdie) {
ie_len = add_mdie(bssid, pos, len); ie_len = add_mdie(bssid, pos, len);
@ -840,4 +842,4 @@ void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie)
} }
#else #else
void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie) { } void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool mdie) { }
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) || defined(CONFIG_WPA3_SAE) */ #endif /* defined(CONFIG_RRM) || defined(CONFIG_IEEE80211R) || defined(CONFIG_WPA3_SAE) */

View File

@ -34,3 +34,4 @@ void esp_set_assoc_ie(uint8_t *bssid, const u8 *ies, size_t ies_len, bool add_md
void supplicant_sta_conn_handler(uint8_t* bssid); void supplicant_sta_conn_handler(uint8_t* bssid);
void supplicant_sta_disconn_handler(uint8_t reason_code); void supplicant_sta_disconn_handler(uint8_t reason_code);
#endif #endif
void wpa_sta_clear_ft_auth_ie(void);

View File

@ -297,6 +297,10 @@ static void wpa_sta_disconnected_cb(uint8_t reason_code)
case WIFI_REASON_INVALID_FTE: case WIFI_REASON_INVALID_FTE:
wpa_sta_clear_curr_pmksa(); wpa_sta_clear_curr_pmksa();
wpa_sm_notify_disassoc(&gWpaSm); wpa_sm_notify_disassoc(&gWpaSm);
#if defined(CONFIG_IEEE80211R)
/* clear all ft auth related IEs so that next will be open auth */
wpa_sta_clear_ft_auth_ie();
#endif
break; break;
default: default:
if (g_wpa_pmk_caching_disabled) { if (g_wpa_pmk_caching_disabled) {

View File

@ -2,3 +2,5 @@ CONFIG_ESP_WIFI_11KV_SUPPORT=y
CONFIG_ESP_WIFI_SCAN_CACHE=y CONFIG_ESP_WIFI_SCAN_CACHE=y
CONFIG_ESP_WIFI_MBO_SUPPORT=y CONFIG_ESP_WIFI_MBO_SUPPORT=y
CONFIG_ESP_WIFI_11R_SUPPORT=y CONFIG_ESP_WIFI_11R_SUPPORT=y
CONFIG_ESP_WIFI_RRM_SUPPORT=y
CONFIG_ESP_WIFI_WNM_SUPPORT=y

View File

@ -1,9 +1,9 @@
CONFIG_IDF_EXPERIMENTAL_FEATURES=y CONFIG_IDF_EXPERIMENTAL_FEATURES=y
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
CONFIG_ESP_WIFI_11KV_SUPPORT=y CONFIG_ESP_WIFI_11KV_SUPPORT=y
CONFIG_ESP_WIFI_SCAN_CACHE=y CONFIG_ESP_WIFI_SCAN_CACHE=y
CONFIG_ESP_WIFI_MBO_SUPPORT=y CONFIG_ESP_WIFI_MBO_SUPPORT=y
CONFIG_ESP_WIFI_ENABLE_ROAMING_APP=y CONFIG_ESP_WIFI_ENABLE_ROAMING_APP=y
CONFIG_ESP_WIFI_11R_SUPPORT=y CONFIG_ESP_WIFI_11R_SUPPORT=y
CONFIG_ESP_WIFI_WNM_SUPPORT=y
CONFIG_ESP_WIFI_RRM_SUPPORT=y