diff --git a/src/platform/nrfconnect/wifi/WiFiManager.cpp b/src/platform/nrfconnect/wifi/WiFiManager.cpp index 117b8063f1..37b075be14 100644 --- a/src/platform/nrfconnect/wifi/WiFiManager.cpp +++ b/src/platform/nrfconnect/wifi/WiFiManager.cpp @@ -180,6 +180,31 @@ void WiFiManager::IPv6MgmtEventHandler(net_mgmt_event_callback * cb, uint32_t mg } } +void WiFiManager::SuppEventHandler(net_mgmt_event_callback * cb, uint32_t mgmtEvent, net_if * iface) +{ + if (mgmtEvent == NET_EVENT_SUPPLICANT_NOT_READY) + { + SystemLayer().ScheduleLambda([] { + if (Instance().mWiFiState == WIFI_STATE_COMPLETED) + { + Instance().mReconnect = true; + Instance().NotifyDisconnected(WLAN_REASON_UNSPECIFIED); + } + }); + } + else if (mgmtEvent == NET_EVENT_SUPPLICANT_READY) + { + SystemLayer().ScheduleLambda([] { + if (Instance().mWantedNetwork.IsConfigured() && Instance().mReconnect) + { + Instance().mReconnect = false; + Instance().SetLowPowerMode(Instance().mWiFiPsEnabled); + Instance().Scan(Instance().mWantedNetwork.GetSsidSpan(), nullptr, nullptr, true /* internal scan */); + } + }); + } +} + CHIP_ERROR WiFiManager::Init() { mNetIf = InetUtils::GetWiFiInterface(); @@ -187,9 +212,11 @@ CHIP_ERROR WiFiManager::Init() net_mgmt_init_event_callback(&mWiFiMgmtClbk, WifiMgmtEventHandler, kWifiManagementEvents); net_mgmt_init_event_callback(&mIPv6MgmtClbk, IPv6MgmtEventHandler, kIPv6ManagementEvents); + net_mgmt_init_event_callback(&mSuppClbk, SuppEventHandler, kSupplicantEvents); net_mgmt_add_event_callback(&mWiFiMgmtClbk); net_mgmt_add_event_callback(&mIPv6MgmtClbk); + net_mgmt_add_event_callback(&mSuppClbk); ChipLogDetail(DeviceLayer, "WiFiManager has been initialized"); @@ -576,19 +603,7 @@ void WiFiManager::DisconnectHandler(Platform::UniquePtr data, size_t le reason = WLAN_REASON_UNSPECIFIED; break; } - Instance().SetLastDisconnectReason(reason); - - ChipLogProgress(DeviceLayer, "WiFi station disconnected"); - Instance().mWiFiState = WIFI_STATE_DISCONNECTED; - Instance().PostConnectivityStatusChange(kConnectivity_Lost); - - WiFiDiagnosticsDelegate * delegate = GetDiagnosticDataProvider().GetWiFiDiagnosticsDelegate(); - if (delegate) - { - delegate->OnConnectionStatusChanged( - to_underlying(app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum::kNotConnected)); - delegate->OnDisconnectionDetected(reason); - } + Instance().NotifyDisconnected(reason); }); if (CHIP_NO_ERROR == err) @@ -598,6 +613,23 @@ void WiFiManager::DisconnectHandler(Platform::UniquePtr data, size_t le } } +void WiFiManager::NotifyDisconnected(uint16_t reason) +{ + SetLastDisconnectReason(reason); + + ChipLogProgress(DeviceLayer, "WiFi station disconnected"); + mWiFiState = WIFI_STATE_DISCONNECTED; + PostConnectivityStatusChange(kConnectivity_Lost); + + WiFiDiagnosticsDelegate * delegate = GetDiagnosticDataProvider().GetWiFiDiagnosticsDelegate(); + if (delegate) + { + delegate->OnConnectionStatusChanged( + to_underlying(app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum::kNotConnected)); + delegate->OnDisconnectionDetected(reason); + } +} + void WiFiManager::IPv6AddressChangeHandler(const void * data) { const in6_addr * addr = reinterpret_cast(data); @@ -692,7 +724,8 @@ CHIP_ERROR WiFiManager::SetLowPowerMode(bool onoff) if ((currentConfig.ps_params.enabled == WIFI_PS_ENABLED && onoff == false) || (currentConfig.ps_params.enabled == WIFI_PS_DISABLED && onoff == true)) { - wifi_ps_params params{ .enabled = onoff ? WIFI_PS_ENABLED : WIFI_PS_DISABLED }; + mWiFiPsEnabled = onoff; + wifi_ps_params params{ .enabled = mWiFiPsEnabled ? WIFI_PS_ENABLED : WIFI_PS_DISABLED }; if (net_mgmt(NET_REQUEST_WIFI_PS, mNetIf, ¶ms, sizeof(params))) { ChipLogError(DeviceLayer, "Set low power mode request failed"); diff --git a/src/platform/nrfconnect/wifi/WiFiManager.h b/src/platform/nrfconnect/wifi/WiFiManager.h index 05a0dd0425..df9f27899f 100644 --- a/src/platform/nrfconnect/wifi/WiFiManager.h +++ b/src/platform/nrfconnect/wifi/WiFiManager.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -205,9 +206,12 @@ class WiFiManager constexpr static uint32_t kIPv6ManagementEvents = NET_EVENT_IPV6_ADDR_ADD | NET_EVENT_IPV6_ADDR_DEL; + constexpr static uint32_t kSupplicantEvents = NET_EVENT_SUPPLICANT_READY | NET_EVENT_SUPPLICANT_NOT_READY; + // Event handling static void WifiMgmtEventHandler(net_mgmt_event_callback * cb, uint32_t mgmtEvent, net_if * iface); static void IPv6MgmtEventHandler(net_mgmt_event_callback * cb, uint32_t mgmtEvent, net_if * iface); + static void SuppEventHandler(net_mgmt_event_callback * cb, uint32_t mgmtEvent, net_if * iface); static void ScanResultHandler(Platform::UniquePtr data, size_t length); static void ScanDoneHandler(Platform::UniquePtr data, size_t length); static void ConnectHandler(Platform::UniquePtr data, size_t length); @@ -229,6 +233,8 @@ class WiFiManager void ResetRecoveryTime(); System::Clock::Milliseconds32 CalculateNextRecoveryTime(); + void NotifyDisconnected(uint16_t reason); + net_if * mNetIf{ nullptr }; ConnectionParams mWiFiParams{}; ConnectionHandling mHandling{}; @@ -238,6 +244,7 @@ class WiFiManager wifi_iface_state mCachedWiFiState; net_mgmt_event_callback mWiFiMgmtClbk{}; net_mgmt_event_callback mIPv6MgmtClbk{}; + net_mgmt_event_callback mSuppClbk{}; ScanResultCallback mScanResultCallback{ nullptr }; ScanDoneCallback mScanDoneCallback{ nullptr }; WiFiNetwork mWantedNetwork{}; @@ -248,6 +255,8 @@ class WiFiManager uint32_t mConnectionRecoveryTimeMs{ kConnectionRecoveryMinIntervalMs }; bool mApplicationDisconnectRequested{ false }; uint16_t mLastDisconnectedReason = WLAN_REASON_UNSPECIFIED; + bool mReconnect{ false }; + bool mWiFiPsEnabled{ true }; static const Map sStatusMap; static const Map sEventHandlerMap;