fix(esp_wifi): Fixed DPP concurrency issue

This commit is contained in:
Kapil Gupta
2025-04-24 13:07:54 +05:30
committed by sibeibei
parent 16985bfd3c
commit 23bc0a51fb

View File

@@ -19,6 +19,7 @@
#include "esp_wps_i.h" #include "esp_wps_i.h"
#include "rsn_supp/wpa.h" #include "rsn_supp/wpa.h"
#include "rsn_supp/pmksa_cache.h" #include "rsn_supp/pmksa_cache.h"
#include <stdatomic.h>
#ifdef CONFIG_DPP #ifdef CONFIG_DPP
@@ -32,7 +33,7 @@ struct action_rx_param {
static void *s_dpp_api_lock = NULL; static void *s_dpp_api_lock = NULL;
static bool s_dpp_listen_in_progress; static atomic_bool s_dpp_listen_in_progress;
static struct esp_dpp_context_t s_dpp_ctx; static struct esp_dpp_context_t s_dpp_ctx;
static int esp_supp_rx_action(uint8_t *hdr, uint8_t *payload, size_t len, uint8_t channel); static int esp_supp_rx_action(uint8_t *hdr, uint8_t *payload, size_t len, uint8_t channel);
static wifi_action_rx_cb_t s_action_rx_cb = esp_supp_rx_action; static wifi_action_rx_cb_t s_action_rx_cb = esp_supp_rx_action;
@@ -75,15 +76,17 @@ static uint8_t esp_dpp_deinit_auth(void)
return ESP_OK; return ESP_OK;
} }
static void listen_stop_handler(void *data, void *user_ctx) static int listen_stop_handler(void *data, void *user_ctx)
{ {
wifi_roc_req_t req = {0}; wifi_roc_req_t req = {0};
s_dpp_listen_in_progress = false; atomic_store(&s_dpp_listen_in_progress, false);
req.ifx = WIFI_IF_STA; req.ifx = WIFI_IF_STA;
req.type = WIFI_ROC_CANCEL; req.type = WIFI_ROC_CANCEL;
esp_wifi_remain_on_channel(&req); esp_wifi_remain_on_channel(&req);
return 0;
} }
static void esp_dpp_call_cb(esp_supp_dpp_event_t evt, void *data) static void esp_dpp_call_cb(esp_supp_dpp_event_t evt, void *data)
@@ -292,7 +295,7 @@ static int esp_dpp_handle_config_obj(struct dpp_authentication *auth,
wpa_printf(MSG_INFO, DPP_EVENT_CONNECTOR "%s", wpa_printf(MSG_INFO, DPP_EVENT_CONNECTOR "%s",
conf->connector); conf->connector);
} }
if (s_dpp_listen_in_progress) { if (atomic_load(&s_dpp_listen_in_progress)) {
listen_stop_handler(NULL, NULL); listen_stop_handler(NULL, NULL);
} }
esp_dpp_call_cb(ESP_SUPP_DPP_CFG_RECVD, wifi_cfg); esp_dpp_call_cb(ESP_SUPP_DPP_CFG_RECVD, wifi_cfg);
@@ -548,7 +551,7 @@ static void esp_dpp_rx_action(void *data, void *user_ctx)
(size_t)(public_action->v.pa_vendor_spec.vendor_data - (size_t)(public_action->v.pa_vendor_spec.vendor_data -
(u8 *)rx_param->action_frm); (u8 *)rx_param->action_frm);
if (s_dpp_listen_in_progress) { if (atomic_load(&s_dpp_listen_in_progress)) {
listen_stop_handler(NULL, NULL); listen_stop_handler(NULL, NULL);
} }
@@ -754,7 +757,7 @@ static void roc_status_handler(void *arg, esp_event_base_t event_base,
{ {
wifi_event_roc_done_t *evt = (wifi_event_roc_done_t *)event_data; wifi_event_roc_done_t *evt = (wifi_event_roc_done_t *)event_data;
if (s_dpp_listen_in_progress && evt->context == (uint32_t)s_action_rx_cb) { if (atomic_load(&s_dpp_listen_in_progress) && evt->context == (uint32_t)s_action_rx_cb) {
eloop_register_timeout(0, 0, esp_dpp_listen_next_channel, NULL, NULL); eloop_register_timeout(0, 0, esp_dpp_listen_next_channel, NULL, NULL);
} }
} }
@@ -937,14 +940,18 @@ esp_err_t esp_supp_dpp_start_listen(void)
/* cancel previous ROC if ongoing */ /* cancel previous ROC if ongoing */
esp_supp_dpp_stop_listen(); esp_supp_dpp_stop_listen();
s_dpp_listen_in_progress = true; atomic_store(&s_dpp_listen_in_progress, true);
eloop_register_timeout(0, 0, esp_dpp_listen_next_channel, NULL, NULL); eloop_register_timeout(0, 0, esp_dpp_listen_next_channel, NULL, NULL);
return 0; return 0;
} }
esp_err_t esp_supp_dpp_stop_listen(void) esp_err_t esp_supp_dpp_stop_listen(void)
{ {
eloop_register_timeout(0, 0, listen_stop_handler, NULL, NULL); int ret = eloop_register_timeout_blocking(listen_stop_handler, NULL, NULL);
if (ret) {
return ESP_FAIL;
}
return ESP_OK; return ESP_OK;
} }
@@ -980,7 +987,7 @@ static int esp_dpp_init(void *eloop_data, void *user_ctx)
goto init_fail; goto init_fail;
} }
s_dpp_listen_in_progress = false; atomic_store(&s_dpp_listen_in_progress, false);
s_dpp_ctx.dpp_event_cb = cb; s_dpp_ctx.dpp_event_cb = cb;
esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_ACTION_TX_STATUS, esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_ACTION_TX_STATUS,