From 34bdbf9ee28269932a69eccb979dcae747d36b36 Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Fri, 28 May 2021 15:52:25 +0530 Subject: [PATCH] wifi_provisioning: Add API to reset state if provisioning fails --- .../include/wifi_provisioning/manager.h | 13 ++++++++ components/wifi_provisioning/src/manager.c | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/components/wifi_provisioning/include/wifi_provisioning/manager.h b/components/wifi_provisioning/include/wifi_provisioning/manager.h index e1b978162a..0d51bd2739 100644 --- a/components/wifi_provisioning/include/wifi_provisioning/manager.h +++ b/components/wifi_provisioning/include/wifi_provisioning/manager.h @@ -563,6 +563,19 @@ esp_err_t wifi_prov_mgr_configure_sta(wifi_config_t *wifi_cfg); * - ESP_FAIL : Failed to reset provisioning config */ esp_err_t wifi_prov_mgr_reset_provisioning(void); + +/** + * @brief Reset internal state machine and clear provisioned credentials. + * + * This API can be used to restart provisioning in case invalid credentials are entered. + * + * @return + * - ESP_OK : Reset provisioning state machine successfully + * - ESP_FAIL : Failed to reset provisioning state machine + * - ESP_ERR_INVALID_STATE : Manager not initialized + */ +esp_err_t wifi_prov_mgr_reset_sm_state_on_failure(void); + #ifdef __cplusplus } #endif diff --git a/components/wifi_provisioning/src/manager.c b/components/wifi_provisioning/src/manager.c index a56b079d24..a48d824ba6 100644 --- a/components/wifi_provisioning/src/manager.c +++ b/components/wifi_provisioning/src/manager.c @@ -1578,3 +1578,34 @@ esp_err_t wifi_prov_mgr_reset_provisioning(void) return ret; } + +esp_err_t wifi_prov_mgr_reset_sm_state_on_failure(void) +{ + if (!prov_ctx_lock) { + ESP_LOGE(TAG, "Provisioning manager not initialized"); + return ESP_ERR_INVALID_STATE; + } + + ACQUIRE_LOCK(prov_ctx_lock); + + esp_err_t err = ESP_OK; + if (prov_ctx->prov_state != WIFI_PROV_STATE_FAIL) { + ESP_LOGE(TAG, "Trying reset when not in failure state. Current state: %d", prov_ctx->prov_state); + err = ESP_ERR_INVALID_STATE; + goto exit; + } + + wifi_config_t wifi_cfg = {0}; + + err = esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to set wifi config, 0x%x", err); + goto exit; + } + + prov_ctx->prov_state = WIFI_PROV_STATE_STARTED; + +exit: + RELEASE_LOCK(prov_ctx_lock); + return err; +}