diff --git a/src/espwifistack.cpp b/src/espwifistack.cpp index 4233b85..e5a27b4 100644 --- a/src/espwifistack.cpp +++ b/src/espwifistack.cpp @@ -240,9 +240,6 @@ struct WifiEvent }; }; -const char * system_event_reasons[] = { "UNSPECIFIED", "AUTH_EXPIRE", "AUTH_LEAVE", "ASSOC_EXPIRE", "ASSOC_TOOMANY", "NOT_AUTHED", "NOT_ASSOCED", "ASSOC_LEAVE", "ASSOC_NOT_AUTHED", "DISASSOC_PWRCAP_BAD", "DISASSOC_SUPCHAN_BAD", "UNSPECIFIED", "IE_INVALID", "MIC_FAILURE", "4WAY_HANDSHAKE_TIMEOUT", "GROUP_KEY_UPDATE_TIMEOUT", "IE_IN_4WAY_DIFFERS", "GROUP_CIPHER_INVALID", "PAIRWISE_CIPHER_INVALID", "AKMP_INVALID", "UNSUPP_RSN_IE_VERSION", "INVALID_RSN_IE_CAP", "802_1X_AUTH_FAILED", "CIPHER_SUITE_REJECTED", "BEACON_TIMEOUT", "NO_AP_FOUND", "AUTH_FAIL", "ASSOC_FAIL", "HANDSHAKE_TIMEOUT", "CONNECTION_FAIL" }; -#define reason2str(r) ((r>176)?system_event_reasons[r-176]:system_event_reasons[r-1]) - #ifdef CONFIG_ETH_ENABLED //#define ETH_PHY_IP101 ETH_PHY_TLK110 @@ -1337,22 +1334,20 @@ void wifi_event_callback(const config &config, const WifiEvent &event) event.wifi_sta_disconnected.ssid_len }; - const auto reason = event.wifi_sta_disconnected.reason; + const auto reason = wifi_err_reason_t(event.wifi_sta_disconnected.reason); { const mac_t bssid{event.wifi_sta_disconnected.bssid}; - const char * const reasonStr = reason2str(reason); _last_sta_error = StaError { .ssid = std::string{ssid}, .bssid = bssid, - .reason = reason, - .reasonStr = reasonStr + .reason = reason }; auto msg = fmt::format("{} WIFI_STA_DISCONNECTED ssid=\"{}\" bssid={} reason={}({})", espchrono::millis_clock::now().time_since_epoch().count(), ssid, toString(bssid), - reason, reasonStr); + std::to_underlying(reason), wifi_stack::toString(reason)); ESP_LOGW(TAG, "%.*s", msg.size(), msg.data()); _last_sta_error_message += msg; _last_sta_error_message += '\n'; diff --git a/src/espwifistack.h b/src/espwifistack.h index ba4d801..c4fb70c 100644 --- a/src/espwifistack.h +++ b/src/espwifistack.h @@ -57,8 +57,7 @@ struct StaError espchrono::millis_clock::time_point timestamp{espchrono::millis_clock::now()}; std::string ssid; mac_t bssid; - uint8_t reason; - const char *reasonStr; + wifi_err_reason_t reason; }; extern const std::optional &last_sta_error; diff --git a/src/espwifiutils.cpp b/src/espwifiutils.cpp index cf9ab13..cc9451a 100644 --- a/src/espwifiutils.cpp +++ b/src/espwifiutils.cpp @@ -119,6 +119,49 @@ std::string toString(esp_netif_dhcp_status_t status) } } +const char * toString(wifi_err_reason_t reason) +{ + switch (reason) + { + case WIFI_REASON_UNSPECIFIED: return "UNSPECIFIED"; + case WIFI_REASON_AUTH_EXPIRE: return "AUTH_EXPIRE"; + case WIFI_REASON_AUTH_LEAVE: return "AUTH_LEAVE"; + case WIFI_REASON_ASSOC_EXPIRE: return "ASSOC_EXPIRE"; + case WIFI_REASON_ASSOC_TOOMANY: return "ASSOC_TOOMANY"; + case WIFI_REASON_NOT_AUTHED: return "NOT_AUTHED"; + case WIFI_REASON_NOT_ASSOCED: return "NOT_ASSOCED"; + case WIFI_REASON_ASSOC_LEAVE: return "ASSOC_LEAVE"; + case WIFI_REASON_ASSOC_NOT_AUTHED: return "ASSOC_NOT_AUTHED"; + case WIFI_REASON_DISASSOC_PWRCAP_BAD: return "DISASSOC_PWRCAP_BAD"; + case WIFI_REASON_DISASSOC_SUPCHAN_BAD: return "DISASSOC_SUPCHAN_BAD"; + case WIFI_REASON_BSS_TRANSITION_DISASSOC: return "BSS_TRANSITION_DISASSOC"; + case WIFI_REASON_IE_INVALID: return "IE_INVALID"; + case WIFI_REASON_MIC_FAILURE: return "MIC_FAILURE"; + case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: return "4WAY_HANDSHAKE_TIMEOUT"; + case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT: return "GROUP_KEY_UPDATE_TIMEOUT"; + case WIFI_REASON_IE_IN_4WAY_DIFFERS: return "IE_IN_4WAY_DIFFERS"; + case WIFI_REASON_GROUP_CIPHER_INVALID: return "GROUP_CIPHER_INVALID"; + case WIFI_REASON_PAIRWISE_CIPHER_INVALID: return "PAIRWISE_CIPHER_INVALID"; + case WIFI_REASON_AKMP_INVALID: return "AKMP_INVALID"; + case WIFI_REASON_UNSUPP_RSN_IE_VERSION: return "UNSUPP_RSN_IE_VERSION"; + case WIFI_REASON_INVALID_RSN_IE_CAP: return "INVALID_RSN_IE_CAP"; + case WIFI_REASON_802_1X_AUTH_FAILED: return "802_1X_AUTH_FAILED"; + case WIFI_REASON_CIPHER_SUITE_REJECTED: return "CIPHER_SUITE_REJECTED"; + case WIFI_REASON_INVALID_PMKID: return "INVALID_PMKID"; + case WIFI_REASON_BEACON_TIMEOUT: return "BEACON_TIMEOUT"; + case WIFI_REASON_NO_AP_FOUND: return "NO_AP_FOUND"; + case WIFI_REASON_AUTH_FAIL: return "AUTH_FAIL"; + case WIFI_REASON_ASSOC_FAIL: return "ASSOC_FAIL"; + case WIFI_REASON_HANDSHAKE_TIMEOUT: return "HANDSHAKE_TIMEOUT"; + case WIFI_REASON_CONNECTION_FAIL: return "CONNECTION_FAIL"; + case WIFI_REASON_AP_TSF_RESET: return "AP_TSF_RESET"; + case WIFI_REASON_ROAMING: return "ROAMING"; + } + + ESP_LOGE(TAG, "unknown reason %" PRIu8, reason); + return "UNKNOWN"; +} + template<> tl::expected fromString(std::string_view str) { mac_t result; diff --git a/src/espwifiutils.h b/src/espwifiutils.h index c1f17bd..d684e9b 100644 --- a/src/espwifiutils.h +++ b/src/espwifiutils.h @@ -24,6 +24,7 @@ std::string toString(wifi_auth_mode_t authMode); std::string toString(wifi_cipher_type_t cipherType); std::string toString(esp_interface_t interface); std::string toString(esp_netif_dhcp_status_t status); +const char * toString(wifi_err_reason_t reason); template tl::expected fromString(std::string_view str) = delete;