fix(esp_wifi):Fix WDT when esp_supp_dpp_start_listen called multiple times

This commit is contained in:
aditi_lonkar
2023-11-08 14:43:04 +05:30
parent 97bfd92534
commit 5fbe36db0f
4 changed files with 24 additions and 9 deletions

View File

@ -392,6 +392,9 @@ static const esp_err_msg_t esp_err_msg_table[] = {
# endif # endif
# ifdef ESP_ERR_WIFI_DISCARD # ifdef ESP_ERR_WIFI_DISCARD
ERR_TBL_IT(ESP_ERR_WIFI_DISCARD), /* 12311 0x3017 Discard frame */ ERR_TBL_IT(ESP_ERR_WIFI_DISCARD), /* 12311 0x3017 Discard frame */
# endif
# ifdef ESP_ERR_WIFI_ROC_IN_PROGRESS
ERR_TBL_IT(ESP_ERR_WIFI_ROC_IN_PROGRESS), /* 12312 0x3018 ROC op is in progress */
# endif # endif
// components/wpa_supplicant/esp_supplicant/include/esp_wps.h // components/wpa_supplicant/esp_supplicant/include/esp_wps.h
# ifdef ESP_ERR_WIFI_REGISTRAR # ifdef ESP_ERR_WIFI_REGISTRAR

View File

@ -83,6 +83,8 @@ extern "C" {
#define ESP_ERR_WIFI_NOT_ASSOC (ESP_ERR_WIFI_BASE + 21) /*!< The WiFi connection is not associated */ #define ESP_ERR_WIFI_NOT_ASSOC (ESP_ERR_WIFI_BASE + 21) /*!< The WiFi connection is not associated */
#define ESP_ERR_WIFI_TX_DISALLOW (ESP_ERR_WIFI_BASE + 22) /*!< The WiFi TX is disallowed */ #define ESP_ERR_WIFI_TX_DISALLOW (ESP_ERR_WIFI_BASE + 22) /*!< The WiFi TX is disallowed */
#define ESP_ERR_WIFI_DISCARD (ESP_ERR_WIFI_BASE + 23) /*!< Discard frame */ #define ESP_ERR_WIFI_DISCARD (ESP_ERR_WIFI_BASE + 23) /*!< Discard frame */
#define ESP_ERR_WIFI_ROC_IN_PROGRESS (ESP_ERR_WIFI_BASE + 24) /*!< ROC op is in progress */
/** /**
* @brief WiFi stack configuration parameters passed to esp_wifi_init call. * @brief WiFi stack configuration parameters passed to esp_wifi_init call.
*/ */

View File

@ -21,7 +21,7 @@ static void *s_dpp_task_hdl = NULL;
static void *s_dpp_evt_queue = NULL; static void *s_dpp_evt_queue = NULL;
static void *s_dpp_api_lock = NULL; static void *s_dpp_api_lock = NULL;
static bool s_dpp_stop_listening; static bool s_dpp_listen_in_progress;
static int s_dpp_auth_retries; static int s_dpp_auth_retries;
static struct esp_dpp_context_t s_dpp_ctx; static struct esp_dpp_context_t s_dpp_ctx;
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;
@ -203,7 +203,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);
} }
s_dpp_stop_listening = false; s_dpp_listen_in_progress = true;
esp_wifi_action_tx_req(WIFI_OFFCHAN_TX_CANCEL, 0, 0, NULL); esp_wifi_action_tx_req(WIFI_OFFCHAN_TX_CANCEL, 0, 0, NULL);
esp_dpp_call_cb(ESP_SUPP_DPP_CFG_RECVD, wifi_cfg); esp_dpp_call_cb(ESP_SUPP_DPP_CFG_RECVD, wifi_cfg);
@ -319,7 +319,7 @@ static void esp_dpp_rx_action(struct action_rx_param *rx_param)
(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_stop_listening) { if (s_dpp_listen_in_progress) {
esp_supp_dpp_stop_listen(); esp_supp_dpp_stop_listen();
} }
@ -380,14 +380,20 @@ static void esp_dpp_task(void *pvParameters )
struct dpp_bootstrap_params_t *p = &s_dpp_ctx.bootstrap_params; struct dpp_bootstrap_params_t *p = &s_dpp_ctx.bootstrap_params;
static int counter; static int counter;
int channel; int channel;
esp_err_t ret = 0;
if (p->num_chan <= 0) { if (p->num_chan <= 0) {
wpa_printf(MSG_ERROR, "Listen channel not set"); wpa_printf(MSG_ERROR, "Listen channel not set");
break; break;
} }
channel = p->chan_list[counter++ % p->num_chan]; channel = p->chan_list[counter++ % p->num_chan];
esp_wifi_remain_on_channel(WIFI_IF_STA, WIFI_ROC_REQ, channel, ret = esp_wifi_remain_on_channel(WIFI_IF_STA, WIFI_ROC_REQ, channel,
BOOTSTRAP_ROC_WAIT_TIME, s_action_rx_cb); BOOTSTRAP_ROC_WAIT_TIME, s_action_rx_cb);
if (ret != ESP_OK) {
wpa_printf(MSG_ERROR, "Failed ROC. error : 0x%x", ret);
break;
}
s_dpp_listen_in_progress = true;
} }
break; break;
@ -466,7 +472,7 @@ static void offchan_event_handler(void *arg, esp_event_base_t event_base,
} else if (event_id == WIFI_EVENT_ROC_DONE) { } else if (event_id == WIFI_EVENT_ROC_DONE) {
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_stop_listening && evt->context == (uint32_t)s_action_rx_cb) { if (s_dpp_listen_in_progress && evt->context == (uint32_t)s_action_rx_cb) {
esp_dpp_post_evt(SIG_DPP_LISTEN_NEXT_CHANNEL, 0); esp_dpp_post_evt(SIG_DPP_LISTEN_NEXT_CHANNEL, 0);
} }
} }
@ -591,6 +597,11 @@ fail:
esp_err_t esp_supp_dpp_start_listen(void) esp_err_t esp_supp_dpp_start_listen(void)
{ {
if (s_dpp_listen_in_progress) {
wpa_printf(MSG_ERROR, "DPP: Failed to start listen as listen is already in progress.");
return ESP_FAIL;
}
if (!s_dpp_ctx.dpp_global || s_dpp_ctx.id < 1) { if (!s_dpp_ctx.dpp_global || s_dpp_ctx.id < 1) {
wpa_printf(MSG_ERROR, "DPP: failed to start listen as dpp not initialized or bootstrapped."); wpa_printf(MSG_ERROR, "DPP: failed to start listen as dpp not initialized or bootstrapped.");
return ESP_FAIL; return ESP_FAIL;
@ -601,13 +612,12 @@ esp_err_t esp_supp_dpp_start_listen(void)
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
s_dpp_stop_listening = false;
return esp_dpp_post_evt(SIG_DPP_LISTEN_NEXT_CHANNEL, 0); return esp_dpp_post_evt(SIG_DPP_LISTEN_NEXT_CHANNEL, 0);
} }
void esp_supp_dpp_stop_listen(void) void esp_supp_dpp_stop_listen(void)
{ {
s_dpp_stop_listening = true; s_dpp_listen_in_progress = false;
esp_wifi_remain_on_channel(WIFI_IF_STA, WIFI_ROC_CANCEL, 0, 0, NULL); esp_wifi_remain_on_channel(WIFI_IF_STA, WIFI_ROC_CANCEL, 0, 0, NULL);
} }
@ -642,7 +652,7 @@ esp_err_t esp_supp_dpp_init(esp_supp_dpp_event_cb_t cb)
cfg.msg_ctx = &s_dpp_ctx; cfg.msg_ctx = &s_dpp_ctx;
s_dpp_ctx.dpp_global = dpp_global_init(&cfg); s_dpp_ctx.dpp_global = dpp_global_init(&cfg);
s_dpp_stop_listening = false; s_dpp_listen_in_progress = false;
s_dpp_evt_queue = os_queue_create(3, sizeof(dpp_event_t)); s_dpp_evt_queue = os_queue_create(3, sizeof(dpp_event_t));
ret = os_task_create(esp_dpp_task, "dppT", DPP_TASK_STACK_SIZE, NULL, 2, &s_dpp_task_hdl); ret = os_task_create(esp_dpp_task, "dppT", DPP_TASK_STACK_SIZE, NULL, 2, &s_dpp_task_hdl);
if (ret != TRUE) { if (ret != TRUE) {