mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
fix(wpa_supplicant): Remove the btm_rrm task from supplicant
This commit removes btm_rrm_t task and CONFIG_SUPPLICANT_TASK from wpa_supplicant and make the functions work in wifi task's context.
This commit is contained in:
parent
5f2fb56755
commit
7900eeca4e
@ -292,13 +292,13 @@ 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_SUPPLICANT_TASK CONFIG_WNM CONFIG_RRM CONFIG_IEEE80211KV)
|
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_WNM CONFIG_RRM CONFIG_IEEE80211KV)
|
||||||
endif()
|
endif()
|
||||||
if(CONFIG_ESP_WIFI_RRM_SUPPORT)
|
if(CONFIG_ESP_WIFI_RRM_SUPPORT)
|
||||||
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_SUPPLICANT_TASK CONFIG_RRM)
|
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_RRM)
|
||||||
endif()
|
endif()
|
||||||
if(CONFIG_ESP_WIFI_WNM_SUPPORT)
|
if(CONFIG_ESP_WIFI_WNM_SUPPORT)
|
||||||
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_SUPPLICANT_TASK CONFIG_WNM)
|
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_WNM)
|
||||||
endif()
|
endif()
|
||||||
if(CONFIG_ESP_WIFI_11R_SUPPORT)
|
if(CONFIG_ESP_WIFI_11R_SUPPORT)
|
||||||
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_IEEE80211R)
|
target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_IEEE80211R)
|
||||||
|
@ -39,40 +39,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)
|
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
|
||||||
|
static int mgmt_rx_action(u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 channel);
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
static void *s_supplicant_task_hdl = NULL;
|
|
||||||
static void *s_supplicant_evt_queue = NULL;
|
|
||||||
static void *s_supplicant_api_lock = NULL;
|
|
||||||
static bool s_supplicant_task_init_done;
|
|
||||||
#define SUPPLICANT_API_LOCK() os_mutex_lock(s_supplicant_api_lock)
|
|
||||||
#define SUPPLICANT_API_UNLOCK() os_mutex_unlock(s_supplicant_api_lock)
|
|
||||||
#define SUPPLICANT_TASK_STACK_SIZE (6144 + TASK_STACK_SIZE_ADD)
|
|
||||||
|
|
||||||
static int handle_action_frm(u8 *frame, size_t len,
|
|
||||||
u8 *sender, int8_t rssi, u8 channel)
|
|
||||||
{
|
|
||||||
struct ieee_mgmt_frame *frm = os_malloc(sizeof(struct ieee_mgmt_frame) + len);
|
|
||||||
|
|
||||||
if (!frm) {
|
|
||||||
wpa_printf(MSG_ERROR, "memory allocation failed");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_memcpy(frm->sender, sender, ETH_ALEN);
|
|
||||||
frm->len = len;
|
|
||||||
frm->channel = channel;
|
|
||||||
frm->rssi = rssi;
|
|
||||||
|
|
||||||
os_memcpy(frm->payload, frame, len);
|
|
||||||
if (esp_supplicant_post_evt(SIG_SUPPLICANT_RX_ACTION, (u32)frm) != 0) {
|
|
||||||
os_free(frm);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
|
|
||||||
#if defined(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,
|
||||||
@ -120,56 +87,6 @@ static int mgmt_rx_action(u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 cha
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
static void btm_rrm_task(void *pvParameters)
|
|
||||||
{
|
|
||||||
supplicant_event_t *evt;
|
|
||||||
bool task_del = false;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if (os_queue_recv(s_supplicant_evt_queue, &evt, OS_BLOCK) != TRUE) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* event validation failed */
|
|
||||||
if (evt->id >= SIG_SUPPLICANT_MAX) {
|
|
||||||
os_free(evt);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (evt->id) {
|
|
||||||
case SIG_SUPPLICANT_RX_ACTION: {
|
|
||||||
struct ieee_mgmt_frame *frm = (struct ieee_mgmt_frame *)evt->data;
|
|
||||||
mgmt_rx_action(frm->payload, frm->len, frm->sender, frm->rssi, frm->channel);
|
|
||||||
os_free(frm);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SIG_SUPPLICANT_SCAN_DONE:
|
|
||||||
esp_supplicant_handle_scan_done_evt();
|
|
||||||
break;
|
|
||||||
case SIG_SUPPLICANT_DEL_TASK:
|
|
||||||
task_del = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_free(evt);
|
|
||||||
|
|
||||||
if (task_del) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
os_queue_delete(s_supplicant_evt_queue);
|
|
||||||
s_supplicant_evt_queue = NULL;
|
|
||||||
|
|
||||||
/* At this point, we completed */
|
|
||||||
os_task_delete(NULL);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
|
|
||||||
static void clear_bssid_flag_and_channel(struct wpa_supplicant *wpa_s)
|
static void clear_bssid_flag_and_channel(struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
wifi_config_t *config;
|
wifi_config_t *config;
|
||||||
@ -307,11 +224,7 @@ static int ieee80211_handle_rx_frm(u8 type, u8 *frame, size_t len, u8 *sender,
|
|||||||
break;
|
break;
|
||||||
#if defined(CONFIG_IEEE80211KV)
|
#if defined(CONFIG_IEEE80211KV)
|
||||||
case WLAN_FC_STYPE_ACTION:
|
case WLAN_FC_STYPE_ACTION:
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
mgmt_rx_action(frame, len, sender, rssi, channel);
|
||||||
ret = handle_action_frm(frame, len, sender, rssi, channel);
|
|
||||||
#else /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
ret = mgmt_rx_action(frame, len, sender, rssi, channel);
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
break;
|
break;
|
||||||
#endif /* defined(CONFIG_IEEE80211KV) */
|
#endif /* defined(CONFIG_IEEE80211KV) */
|
||||||
default:
|
default:
|
||||||
@ -356,32 +269,6 @@ int esp_supplicant_common_init(struct wpa_funcs *wpa_cb)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
|
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
if (!s_supplicant_api_lock) {
|
|
||||||
s_supplicant_api_lock = os_recursive_mutex_create();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!s_supplicant_api_lock) {
|
|
||||||
wpa_printf(MSG_ERROR, "%s: failed to create Supplicant API lock", __func__);
|
|
||||||
ret = -1;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
s_supplicant_evt_queue = os_queue_create(3, sizeof(supplicant_event_t));
|
|
||||||
|
|
||||||
if (!s_supplicant_evt_queue) {
|
|
||||||
wpa_printf(MSG_ERROR, "%s: failed to create Supplicant event queue", __func__);
|
|
||||||
ret = -1;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
ret = os_task_create(btm_rrm_task, "btm_rrm_t", SUPPLICANT_TASK_STACK_SIZE, NULL, 2, &s_supplicant_task_hdl);
|
|
||||||
if (ret != TRUE) {
|
|
||||||
wpa_printf(MSG_ERROR, "btm: failed to create task");
|
|
||||||
ret = -1;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
s_supplicant_task_init_done = true;
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
#if defined(CONFIG_RRM)
|
#if defined(CONFIG_RRM)
|
||||||
wpas_rrm_reset(wpa_s);
|
wpas_rrm_reset(wpa_s);
|
||||||
wpas_clear_beacon_rep_data(wpa_s);
|
wpas_clear_beacon_rep_data(wpa_s);
|
||||||
@ -425,26 +312,6 @@ void esp_supplicant_common_deinit(void)
|
|||||||
esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype);
|
esp_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype);
|
||||||
}
|
}
|
||||||
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
|
#if defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R)
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
/* We have failed to create task, delete queue and exit */
|
|
||||||
if (!s_supplicant_task_hdl) {
|
|
||||||
if (s_supplicant_evt_queue) {
|
|
||||||
os_queue_delete(s_supplicant_evt_queue);
|
|
||||||
s_supplicant_evt_queue = NULL;
|
|
||||||
}
|
|
||||||
if (s_supplicant_api_lock) {
|
|
||||||
os_mutex_delete(s_supplicant_api_lock);
|
|
||||||
s_supplicant_api_lock = NULL;
|
|
||||||
}
|
|
||||||
} else if (esp_supplicant_post_evt(SIG_SUPPLICANT_DEL_TASK, 0) != 0) {
|
|
||||||
/* failed to post delete event, just delete event queue and exit */
|
|
||||||
if (s_supplicant_evt_queue) {
|
|
||||||
os_queue_delete(s_supplicant_evt_queue);
|
|
||||||
s_supplicant_evt_queue = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s_supplicant_task_init_done = false;
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
|
#endif /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -900,39 +767,6 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
int esp_supplicant_post_evt(uint32_t evt_id, uint32_t data)
|
|
||||||
{
|
|
||||||
supplicant_event_t *evt = os_zalloc(sizeof(supplicant_event_t));
|
|
||||||
if (!evt) {
|
|
||||||
wpa_printf(MSG_ERROR, "Failed to allocated memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
evt->id = evt_id;
|
|
||||||
evt->data = data;
|
|
||||||
|
|
||||||
/* Make sure lock exists before taking it */
|
|
||||||
SUPPLICANT_API_LOCK();
|
|
||||||
|
|
||||||
/* Make sure no event can be sent when deletion event is sent or task not initialized */
|
|
||||||
if (!s_supplicant_task_init_done) {
|
|
||||||
SUPPLICANT_API_UNLOCK();
|
|
||||||
os_free(evt);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (os_queue_send(s_supplicant_evt_queue, &evt, os_task_ms_to_tick(10)) != TRUE) {
|
|
||||||
SUPPLICANT_API_UNLOCK();
|
|
||||||
os_free(evt);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (evt_id == SIG_SUPPLICANT_DEL_TASK) {
|
|
||||||
s_supplicant_task_init_done = false;
|
|
||||||
}
|
|
||||||
SUPPLICANT_API_UNLOCK();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SUPPLICANT_TASK */
|
|
||||||
#else /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
|
#else /* defined(CONFIG_IEEE80211KV) || defined(CONFIG_IEEE80211R) */
|
||||||
void esp_set_scan_ie(void) { }
|
void esp_set_scan_ie(void) { }
|
||||||
|
|
||||||
|
@ -21,20 +21,6 @@ struct ieee_mgmt_frame {
|
|||||||
u8 payload[0];
|
u8 payload[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
int esp_supplicant_post_evt(uint32_t evt_id, uint32_t data);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t id;
|
|
||||||
uint32_t data;
|
|
||||||
} supplicant_event_t;
|
|
||||||
|
|
||||||
enum SIG_SUPPLICANT {
|
|
||||||
SIG_SUPPLICANT_RX_ACTION,
|
|
||||||
SIG_SUPPLICANT_SCAN_DONE,
|
|
||||||
SIG_SUPPLICANT_DEL_TASK,
|
|
||||||
SIG_SUPPLICANT_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
void esp_get_tx_power(uint8_t *tx_power);
|
void esp_get_tx_power(uint8_t *tx_power);
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
bool mbo_bss_profile_match(u8 *bssid);
|
bool mbo_bss_profile_match(u8 *bssid);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "common/wnm_sta.h"
|
#include "common/wnm_sta.h"
|
||||||
#include "esp_scan_i.h"
|
#include "esp_scan_i.h"
|
||||||
#include "esp_common_i.h"
|
#include "esp_common_i.h"
|
||||||
|
#include "eloop.h"
|
||||||
|
|
||||||
extern struct wpa_supplicant g_wpa_supp;
|
extern struct wpa_supplicant g_wpa_supp;
|
||||||
|
|
||||||
@ -35,13 +36,7 @@ static void scan_done_event_handler(void *arg, ETS_STATUS status)
|
|||||||
wpa_s->type &= ~(1 << WLAN_FC_STYPE_BEACON) & ~(1 << WLAN_FC_STYPE_PROBE_RESP);
|
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_wifi_register_mgmt_frame_internal(wpa_s->type, wpa_s->subtype);
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_SUPPLICANT_TASK
|
|
||||||
if (esp_supplicant_post_evt(SIG_SUPPLICANT_SCAN_DONE, 0) != 0) {
|
|
||||||
wpa_printf(MSG_ERROR, "Posting of scan done failed!");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
esp_supplicant_handle_scan_done_evt();
|
esp_supplicant_handle_scan_done_evt();
|
||||||
#endif /*CONFIG_SUPPLICANT_TASK*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_WNM)
|
#if defined(CONFIG_WNM)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user