From fb3517735354742e45d6a51a40161e42f853a3bd Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:38:36 +0530 Subject: [PATCH 01/67] Update the event message --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 4b356357ee9..8a624ea0fe9 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -116,7 +116,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) case to_underlying(WifiInterface::WifiEvent::kGotIPv4): case to_underlying(WifiInterface::WifiEvent::kLostIP): case to_underlying(WifiInterface::WifiEvent::kGotIPv6): - ChipLogProgress(DeviceLayer, "IP Change Event"); + ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_IP_CHANGE"); UpdateInternetConnectivityState(); break; default: From 35179429af859f3b1d43571d77210a43c090d724 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 10 Sep 2026 10:06:36 +0530 Subject: [PATCH 02/67] Rename `kWFXSystemEvent` to `kPlatformSLEvent` --- src/platform/silabs/CHIPDevicePlatformEvent.h | 2 +- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- src/platform/silabs/PlatformManagerImpl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/silabs/CHIPDevicePlatformEvent.h b/src/platform/silabs/CHIPDevicePlatformEvent.h index bf2af0228e4..6badd490f5a 100644 --- a/src/platform/silabs/CHIPDevicePlatformEvent.h +++ b/src/platform/silabs/CHIPDevicePlatformEvent.h @@ -48,7 +48,7 @@ enum PublicPlatformSpecificEventTypes */ enum InternalPlatformSpecificEventTypes { - kWFXSystemEvent = kRange_InternalPlatformSpecific, + kPlatformSLEvent = kRange_InternalPlatformSpecific, }; } // namespace DeviceEventType diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 8a624ea0fe9..f8e6a329db9 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -80,7 +80,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // Forward the event to the generic base classes as needed. // Handle Wfx wifi events... - if (event->Type == DeviceEventType::kWFXSystemEvent) + if (event->Type == DeviceEventType::kPlatformSLEvent) { switch (event->Platform.event.WFXSystemEvent.data.genericMsgEvent.header.id) diff --git a/src/platform/silabs/PlatformManagerImpl.cpp b/src/platform/silabs/PlatformManagerImpl.cpp index 0e87c67efa4..33efb1093f6 100644 --- a/src/platform/silabs/PlatformManagerImpl.cpp +++ b/src/platform/silabs/PlatformManagerImpl.cpp @@ -195,7 +195,7 @@ void HandleWFXSystemEvent(sl_wfx_generic_message_t * eventData) ChipDeviceEvent event; memset(&event, 0, sizeof(event)); - event.Type = DeviceEventType::kWFXSystemEvent; + event.Type = DeviceEventType::kPlatformSLEvent; switch (eventData->header.id) { From dcdaaf3aa43e869125f58ab70ea4217d1bea2e3d Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 10 Sep 2026 10:06:53 +0530 Subject: [PATCH 03/67] Add kSLSystemEvent to PublicPlatformSpecificEventTypes enum --- src/platform/silabs/CHIPDevicePlatformEvent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/CHIPDevicePlatformEvent.h b/src/platform/silabs/CHIPDevicePlatformEvent.h index 6badd490f5a..339d24fac78 100644 --- a/src/platform/silabs/CHIPDevicePlatformEvent.h +++ b/src/platform/silabs/CHIPDevicePlatformEvent.h @@ -40,7 +40,7 @@ namespace DeviceEventType { */ enum PublicPlatformSpecificEventTypes { - /* None currently defined */ + kSLSystemEvent = kRange_PublicPlatformSpecific, }; /** From 6b2d9a4c70754c0f142de1ff39c6127818b75575 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:12:35 +0530 Subject: [PATCH 04/67] TEMP: commit code --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 47 ++++++++++--------- .../silabs/NetworkCommissioningWiFiDriver.cpp | 6 ++- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 5 +- .../silabs/wifi/SiWx/WifiInterfaceImpl.h | 2 +- src/platform/silabs/wifi/WifiInterface.h | 7 ++- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index f8e6a329db9..e0bfaf09760 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -56,7 +56,6 @@ ConnectivityManagerImpl ConnectivityManagerImpl::sInstance; CHIP_ERROR ConnectivityManagerImpl::_Init() { CHIP_ERROR err; - // Queue work items to bootstrap the AP and station state machines once the Chip event loop is running. mWiFiStationMode = kWiFiStationMode_Disabled; mWiFiStationState = kWiFiStationState_NotConnected; mLastStationConnectFailTime = System::Clock::kZero; @@ -66,8 +65,10 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() // TODO Initialize the Chip Addressing and Routing Module. // Ensure that station mode is enabled. - WifiInterface::GetInstance().ConfigureStationMode(); + err = WifiInterface::GetInstance().EnableStationMode(); + SuccessOrExit(err); + // Queue work items to bootstrap the AP and station state machines once the Chip event loop is running. err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); SuccessOrExit(err); @@ -152,35 +153,34 @@ bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void) return WifiInterface::GetInstance().IsStationModeEnabled(); } -CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val) +CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode newWiFiStationMode) { - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - - if (mWiFiStationMode != val) - { - ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), - WiFiStationModeToStr(val)); - } + // If the new WiFi station mode is the same as the current WiFi station mode, return success. + VerifyOrReturnError(newWiFiStationMode != mWiFiStationMode, CHIP_NO_ERROR); - mWiFiStationMode = val; + ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), + WiFiStationModeToStr(newWiFiStationMode)); + mWiFiStationMode = newWiFiStationMode; + VerifyOrReturnError(WifiInterface::GetInstance().EnableStationMode() == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); return CHIP_NO_ERROR; } -CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationReconnectInterval(System::Clock::Timeout val) +CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationReconnectInterval(System::Clock::Timeout timeoutMs) { - mWiFiStationReconnectInterval = val; + mWiFiStationReconnectInterval = timeoutMs; return CHIP_NO_ERROR; } void ConnectivityManagerImpl::_ClearWiFiStationProvision(void) { - if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled) - { - WifiInterface::GetInstance().ClearWifiCredentials(); + // If the WiFi station mode is application controlled, do not clear the WiFi credentials. + VerifyOrReturn(mWiFiStationMode != kWiFiStationMode_ApplicationControlled, + ChipLogError(DeviceLayer, "kWiFiStationMode_ApplicationControlled enabled")); - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - } + WifiInterface::GetInstance().ClearWifiCredentials(); + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); } CHIP_ERROR ConnectivityManagerImpl::_GetAndLogWifiStatsCounters(void) @@ -214,21 +214,24 @@ CHIP_ERROR ConnectivityManagerImpl::_SetPollingInterval(System::Clock::Milliseco void ConnectivityManagerImpl::DriveStationState() { + CHIP_ERROR error = CHIP_NO_ERROR; bool stationConnected = false; - // Refresh the current station mode. + // Refresh the current state and store it in `mWiFiStationMode` GetWiFiStationMode(); // If the station interface is NOT under application control... if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled) { // Ensure that the Wifi task is started. - CHIP_ERROR error = WifiInterface::GetInstance().StartWifiTask(); + error = WifiInterface::GetInstance().StartWifiTask(); VerifyOrReturn(error == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "StartWifiTask() failed: %" CHIP_ERROR_FORMAT, error.Format())); - // Ensure that station mode is enabled in the WiFi layer. - WifiInterface::GetInstance().ConfigureStationMode(); + error = SetWiFiStationMode(kWiFiStationMode_Enabled); + VerifyOrReturn( + error == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "SetStationMode(kWiFiStationMode_Enabled) failed: %" CHIP_ERROR_FORMAT, error.Format())); } stationConnected = WifiInterface::GetInstance().IsStationConnected(); diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index d9b9ef1b5b2..f4a7c2db122 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -100,17 +100,19 @@ Status SlWiFiDriver::AddOrUpdateNetwork(ByteSpan ssid, ByteSpan credentials, Mut uint8_t & outNetworkIndex) { outDebugText.reduce_size(0); + // since we only support one network, we always return 0 outNetworkIndex = 0; + // using ssid as the networkId VerifyOrReturnError(mStagingNetwork.ssidLen == 0 || NetworkMatch(mStagingNetwork, ssid), Status::kBoundsExceeded); VerifyOrReturnError(credentials.size() <= sizeof(mStagingNetwork.key), Status::kOutOfRange); VerifyOrReturnError(ssid.size() <= sizeof(mStagingNetwork.ssid), Status::kOutOfRange); - VerifyOrReturnError(ssid.data() != nullptr, Status::kNetworkNotFound); + VerifyOrReturnError(ssid.data() != nullptr, Status::kNetworkIDNotFound); MutableByteSpan ssidSpan(mStagingNetwork.ssid, sizeof(mStagingNetwork.ssid)); VerifyOrReturnError(CopySpanToMutableSpan(ssid, ssidSpan) == CHIP_NO_ERROR, Status::kBoundsExceeded); mStagingNetwork.ssidLen = ssid.size(); - VerifyOrReturnError(credentials.data() != nullptr, Status::kNetworkNotFound); + VerifyOrReturnError(credentials.data() != nullptr, Status::kNetworkIDNotFound); MutableByteSpan keySpan(mStagingNetwork.key, sizeof(mStagingNetwork.key)); VerifyOrReturnError(CopySpanToMutableSpan(credentials, keySpan) == CHIP_NO_ERROR, Status::kBoundsExceeded); mStagingNetwork.keyLen = credentials.size(); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 3409eb89b98..b3d22ab4c86 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -36,7 +36,7 @@ #include // TODO: Remove nogncheck once we have a proper way to include this file. #include // nogncheck -#endif // SL_INET_CONFIG_UDP_LWIP_QUEUE_UNTIL_NETIF_READY +#endif // SL_INET_CONFIG_UDP_LWIP_QUEUE_UNTIL_NETIF_READY #include #include #include @@ -1129,9 +1129,10 @@ CHIP_ERROR WifiInterfaceImpl::StartWifiTask() return CHIP_NO_ERROR; } -void WifiInterfaceImpl::ConfigureStationMode() +CHIP_ERROR WifiInterfaceImpl::ConfigureStationMode() { wfx_rsi.dev_state.Set(WifiState::kStationMode); + return CHIP_NO_ERROR; } bool WifiInterfaceImpl::IsStationModeEnabled() diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h index 04dc669dc4c..2f520b9cad2 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h @@ -53,7 +53,7 @@ class WifiInterfaceImpl final : public WifiInterface CHIP_ERROR GetMacAddress(sl_wfx_interface_t interface, chip::MutableByteSpan & addr) override; CHIP_ERROR StartNetworkScan(chip::ByteSpan ssid, ScanCallback callback) override; CHIP_ERROR StartWifiTask() override; - void ConfigureStationMode() override; + CHIP_ERROR EnableStationMode() override; bool IsStationConnected() override; bool IsStationModeEnabled() override; bool IsStationReady() override; diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index a3ddd6d74b8..b8e693d2c93 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -220,9 +220,12 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface virtual CHIP_ERROR StartWifiTask() = 0; /** - * @brief Configures the Wi-Fi devices as a Wi-Fi station + * @brief Enables the Wi-Fi station mode + * + * @return CHIP_ERROR CHIP_NO_ERROR if the station mode was successfully enabled + * CHIP_ERROR_INTERNAL if the station mode could not be enabled */ - virtual void ConfigureStationMode() = 0; + virtual CHIP_ERROR EnableStationMode() = 0; /** * @brief Triggers the device to disconnect from the connected Wi-Fi network From 2e773bfe96354037fa370bc826d8c32750034488 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 11 Sep 2026 08:10:21 +0530 Subject: [PATCH 05/67] bugfix name --- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index b3d22ab4c86..32c318c5a95 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -1129,7 +1129,7 @@ CHIP_ERROR WifiInterfaceImpl::StartWifiTask() return CHIP_NO_ERROR; } -CHIP_ERROR WifiInterfaceImpl::ConfigureStationMode() +CHIP_ERROR WifiInterfaceImpl::EnableStationMode() { wfx_rsi.dev_state.Set(WifiState::kStationMode); return CHIP_NO_ERROR; From d2edeae6eba837df9cb5a88cb5ba027c1e21aff0 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 11 Sep 2026 08:20:12 +0530 Subject: [PATCH 06/67] Replace direct call to EnableStationMode with SetWiFiStationMode for improved error handling and clarity. Simplify exit logic by removing unnecessary exit label. --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index e0bfaf09760..b1f8bfc5739 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -65,16 +65,14 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() // TODO Initialize the Chip Addressing and Routing Module. // Ensure that station mode is enabled. - err = WifiInterface::GetInstance().EnableStationMode(); - SuccessOrExit(err); + err = SetWiFiStationMode(kWiFiStationMode_Enabled); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); // Queue work items to bootstrap the AP and station state machines once the Chip event loop is running. err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); - SuccessOrExit(err); - -exit: - return err; + return CHIP_NO_ERROR; } void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) From ab29dcb843c810303f71b974d8d23a7107700998 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 11 Sep 2026 08:26:05 +0530 Subject: [PATCH 07/67] revert to `val` --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index b1f8bfc5739..2ffcf24017d 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -151,15 +151,15 @@ bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void) return WifiInterface::GetInstance().IsStationModeEnabled(); } -CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode newWiFiStationMode) +CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val) { // If the new WiFi station mode is the same as the current WiFi station mode, return success. - VerifyOrReturnError(newWiFiStationMode != mWiFiStationMode, CHIP_NO_ERROR); + VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR); ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), - WiFiStationModeToStr(newWiFiStationMode)); + WiFiStationModeToStr(val)); - mWiFiStationMode = newWiFiStationMode; + mWiFiStationMode = val; VerifyOrReturnError(WifiInterface::GetInstance().EnableStationMode() == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); return CHIP_NO_ERROR; From a879333e46c2a6ca148c82104ff3bd29bba5b752 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 11 Sep 2026 15:24:18 +0530 Subject: [PATCH 08/67] Adds fix to make `SL_ONNETWORK_PAIRING` work as default SSID and PSK instead of hardcoded. --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 2 -- .../silabs/NetworkCommissioningWiFiDriver.cpp | 26 ++++++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 2ffcf24017d..f0fd7bb3002 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -250,7 +250,6 @@ void ConnectivityManagerImpl::DriveStationState() // If the WiFi station interface is no longer enabled, or no longer provisioned, // disconnect the station from the AP, unless the WiFi station mode is currently // under application control. -#ifndef SL_ONNETWORK_PAIRING // Incase of station interface disabled & provisioned, wifi_station should not be disconnected. // Device will try to reconnect. if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled && @@ -261,7 +260,6 @@ void ConnectivityManagerImpl::DriveStationState() WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); } -#endif } // Otherwise the station interface is NOT connected to an AP, so... else diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index f4a7c2db122..ea23ed44835 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -45,24 +45,30 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC mpConnectCallback = nullptr; mpStatusChangeCallback = networkStatusChangeCallback; mDriver = this; - // TODO: default to SL_WIFI_SSID and SL_WIFI_PSK if not defined -#ifdef SL_ONNETWORK_PAIRING - memcpy(&mSavedNetwork.ssid[0], SL_WIFI_SSID, sizeof(SL_WIFI_SSID)); - memcpy(&mSavedNetwork.key[0], SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); - mSavedNetwork.keyLen = sizeof(SL_WIFI_PSK); - mSavedNetwork.ssidLen = sizeof(SL_WIFI_SSID); - err = CHIP_NO_ERROR; -#else // If reading fails, wifi is not provisioned, no need to go further. err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiSSID, mSavedNetwork.ssid, sizeof(mSavedNetwork.ssid), mSavedNetwork.ssidLen); + if (err != CHIP_NO_ERROR) + { +#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING + memcpy(&mSavedNetwork.ssid, SL_WIFI_SSID, sizeof(SL_WIFI_SSID)); + mSavedNetwork.ssidLen = sizeof(SL_WIFI_SSID); + err = CHIP_NO_ERROR; +#endif // SL_ONNETWORK_PAIRING + } VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiPSK, mSavedNetwork.key, sizeof(mSavedNetwork.key), mSavedNetwork.keyLen); - VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); - +if (err != CHIP_NO_ERROR) +{ +#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING + memcpy(&mSavedNetwork.key, SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); + mSavedNetwork.keyLen = sizeof(SL_WIFI_PSK); + err = CHIP_NO_ERROR; #endif // SL_ONNETWORK_PAIRING +} + VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); mStagingNetwork = mSavedNetwork; err = ConnectWiFiNetwork(reinterpret_cast(mSavedNetwork.ssid), mSavedNetwork.ssidLen, reinterpret_cast(mSavedNetwork.key), mSavedNetwork.keyLen); From e44d5d048a9ef6bc7ee6cc4fc1a1f62c08a903de Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:28:28 +0530 Subject: [PATCH 09/67] Remove temporary commit configuration call in WiFi network connection handling to streamline the connection process. --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index ea23ed44835..aacff90e030 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -207,7 +207,6 @@ void SlWiFiDriver::OnConnectWiFiNetwork() { if (mpConnectCallback) { - TEMPORARY_RETURN_IGNORED CommitConfiguration(); mpConnectCallback->OnResult(Status::kSuccess, CharSpan(), 0); mpConnectCallback = nullptr; } From ee46c172b9a69005625adedd2a60b7591d6131e4 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 02:18:59 +0530 Subject: [PATCH 10/67] Adding comments for variables --- src/platform/silabs/ConnectivityManagerImpl.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index c2890b936a7..49e32a30981 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -117,10 +117,13 @@ class ConnectivityManagerImpl final : public ConnectivityManager, // ===== Private members reserved for use by this class only. #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION - System::Clock::Timestamp mLastStationConnectFailTime; + // variables for tracking the station mode and state WiFiStationMode mWiFiStationMode; WiFiStationState mWiFiStationState; + // variables for tracking the last connection failure time and reconnect interval + System::Clock::Timestamp mLastStationConnectFailTime; System::Clock::Timeout mWiFiStationReconnectInterval; + // flags for tracking the internet connectivity state BitFlags mFlags; void DriveStationState(void); From f815f0b18b884c12cd3c70955cef9a29c97ed47a Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 02:17:55 +0530 Subject: [PATCH 11/67] Enhance WiFi connection handling by disconnecting and clearing credentials if the station is provisioned before connecting to a new network. Add comments for clarity on the connection process. --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index aacff90e030..4aa0958db3a 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -148,8 +148,10 @@ Status SlWiFiDriver::ReorderNetwork(ByteSpan networkId, uint8_t index, MutableCh CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen) { + // if the WiFi station is provisioned, disconnect it and clear the credentials if (ConnectivityMgr().IsWiFiStationProvisioned()) { + ConnectivityMgr().ClearWiFiStationProvision(); ChipLogProgress(DeviceLayer, "Disconnecting for current wifi"); WifiInterface::GetInstance().TriggerDisconnection(); } @@ -166,6 +168,7 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, memcpy(wifiConfig.key, key, keyLen); wifiConfig.keyLen = keyLen; + // dummy value which is overridden by the actual security value when connecting to the access point wifiConfig.security.Set(chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap::kWpa2Personal); ChipLogProgress(NetworkProvisioning, "Setting up connection for WiFi SSID: %s", NullTerminated(ssid, ssidLen).c_str()); From 478f5c2d3f5d6a77eed6972584bc0813fb59a286 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:28:02 +0530 Subject: [PATCH 12/67] Refactor WiFi event handling in ConnectivityManagerImpl. Update log messages for WiFi events and streamline state transitions by removing unnecessary checks. Enhance error handling in setting WiFi station mode and improve clarity in DriveStationState logic. --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 244 ++++++++---------- 1 file changed, 103 insertions(+), 141 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index f0fd7bb3002..8b3e97c9487 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -85,36 +85,23 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) switch (event->Platform.event.WFXSystemEvent.data.genericMsgEvent.header.id) { case to_underlying(WifiInterface::WifiEvent::kStartUp): - ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_START"); + ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_STARTED"); DriveStationState(); break; + case to_underlying(WifiInterface::WifiEvent::kConnect): ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_CONNECTED"); - if (mWiFiStationState == kWiFiStationState_Connecting) - { - if (event->Platform.event.WFXSystemEvent.data.connectEvent.body.status == 0) - { - ChangeWiFiStationState(kWiFiStationState_Connecting_Succeeded); - } - else - { - ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); - } - } - DriveStationState(); + ChangeWiFiStationState(kWiFiStationState_Connected); break; + case to_underlying(WifiInterface::WifiEvent::kDisconnect): ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_DISCONNECTED"); - if (mWiFiStationState == kWiFiStationState_Connecting) - { - ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); - } - DriveStationState(); + ChangeWiFiStationState(kWiFiStationState_NotConnected); break; case to_underlying(WifiInterface::WifiEvent::kGotIPv4): - case to_underlying(WifiInterface::WifiEvent::kLostIP): case to_underlying(WifiInterface::WifiEvent::kGotIPv6): + case to_underlying(WifiInterface::WifiEvent::kLostIP): ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_IP_CHANGE"); UpdateInternetConnectivityState(); break; @@ -126,19 +113,8 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) ConnectivityManager::WiFiStationMode ConnectivityManagerImpl::_GetWiFiStationMode(void) { - if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled) - { - if (WifiInterface::GetInstance().IsStationModeEnabled()) - { - mWiFiStationMode = kWiFiStationMode_Enabled; - } - else - { - mWiFiStationMode = kWiFiStationMode_Disabled; - } - } - - return mWiFiStationMode; + VerifyOrReturnValue(mWiFiStationMode != kWiFiStationMode_ApplicationControlled, mWiFiStationMode); + return WifiInterface::GetInstance().IsStationModeEnabled() ? kWiFiStationMode_Enabled : kWiFiStationMode_Disabled; } bool ConnectivityManagerImpl::_IsWiFiStationProvisioned(void) @@ -154,7 +130,8 @@ bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void) CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val) { // If the new WiFi station mode is the same as the current WiFi station mode, return success. - VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR); + VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR, + ChipLogDetail(DeviceLayer, "WiFi station mode is already %s", WiFiStationModeToStr(val))); ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), WiFiStationModeToStr(val)); @@ -212,115 +189,85 @@ CHIP_ERROR ConnectivityManagerImpl::_SetPollingInterval(System::Clock::Milliseco void ConnectivityManagerImpl::DriveStationState() { - CHIP_ERROR error = CHIP_NO_ERROR; - bool stationConnected = false; - // Refresh the current state and store it in `mWiFiStationMode` - GetWiFiStationMode(); + WiFiStationMode stationMode = GetWiFiStationMode(); - // If the station interface is NOT under application control... - if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled) - { - // Ensure that the Wifi task is started. - error = WifiInterface::GetInstance().StartWifiTask(); - VerifyOrReturn(error == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "StartWifiTask() failed: %" CHIP_ERROR_FORMAT, error.Format())); - - error = SetWiFiStationMode(kWiFiStationMode_Enabled); - VerifyOrReturn( - error == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "SetStationMode(kWiFiStationMode_Enabled) failed: %" CHIP_ERROR_FORMAT, error.Format())); - } + // if the station mode is application controlled or disabled, return + VerifyOrReturn(stationMode != kWiFiStationMode_ApplicationControlled, + ChipLogError(DeviceLayer, "WiFi station mode is application controlled")); + VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogError(DeviceLayer, "WiFi station mode is disabled")); - stationConnected = WifiInterface::GetInstance().IsStationConnected(); + CHIP_ERROR err = CHIP_NO_ERROR; - // If the station interface is currently connected ... - if (stationConnected) - { - // Advance the station state to Connected if it was previously NotConnected or - // a previously initiated connect attempt succeeded. - if (mWiFiStationState == kWiFiStationState_NotConnected || mWiFiStationState == kWiFiStationState_Connecting_Succeeded) - { - ChangeWiFiStationState(kWiFiStationState_Connected); - ChipLogProgress(DeviceLayer, "WiFi station interface connected"); - mLastStationConnectFailTime = System::Clock::kZero; - OnStationConnected(); - } + // If the station interface is NOT under application control... + // Ensure that the WiFi task is started. + // returns CHIP_NO_ERROR if the task is started successfully, also when the task is already started + err = WifiInterface::GetInstance().StartWifiTask(); + VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "StartWifiTask failed: %" CHIP_ERROR_FORMAT, err.Format())); - // If the WiFi station interface is no longer enabled, or no longer provisioned, - // disconnect the station from the AP, unless the WiFi station mode is currently - // under application control. - // Incase of station interface disabled & provisioned, wifi_station should not be disconnected. - // Device will try to reconnect. - if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled && - (mWiFiStationMode != kWiFiStationMode_Enabled && !IsWiFiStationProvisioned())) - { - ChipLogProgress(DeviceLayer, "Disconnecting WiFi station interface"); + err = SetWiFiStationMode(kWiFiStationMode_Enabled); + VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "SetStationMode failed: %" CHIP_ERROR_FORMAT, err.Format())); - WifiInterface::GetInstance().TriggerDisconnection(); - ChangeWiFiStationState(kWiFiStationState_Disconnecting); - } - } - // Otherwise the station interface is NOT connected to an AP, so... - else + // if the station is not provisioned but connected, disconnect it + if (!IsWiFiStationProvisioned() && IsWiFiStationConnected()) { - System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); - - // Advance the station state to NotConnected if it was previously Connected or Disconnecting, - // or if a previous initiated connect attempt failed. - if (mWiFiStationState == kWiFiStationState_Connected || mWiFiStationState == kWiFiStationState_Disconnecting || - mWiFiStationState == kWiFiStationState_Connecting_Failed) - { - WiFiStationState prevState = mWiFiStationState; - ChangeWiFiStationState(kWiFiStationState_NotConnected); - if (prevState != kWiFiStationState_Connecting_Failed) - { - ChipLogProgress(DeviceLayer, "WiFi station interface disconnected"); - mLastStationConnectFailTime = System::Clock::kZero; - OnStationDisconnected(); - } - else - { - mLastStationConnectFailTime = now; - } - } - - // If the WiFi station interface is now enabled and provisioned (and by implication, - // not presently under application control), AND the system is not in the process of - // scanning, then... - if (mWiFiStationMode == kWiFiStationMode_Enabled && IsWiFiStationProvisioned()) - { - // Initiate a connection to the AP if we haven't done so before, or if enough - // time has passed since the last attempt. - if (mLastStationConnectFailTime == System::Clock::kZero || - now >= mLastStationConnectFailTime + mWiFiStationReconnectInterval) - { - if (mWiFiStationState != kWiFiStationState_Connecting) - { - ChipLogProgress(DeviceLayer, "Attempting to connect WiFi"); - SuccessOrExitAction(WifiInterface::GetInstance().ConnectToAccessPoint(), - ChipLogError(DeviceLayer, "ConnectToAccessPoint() failed")); - - ChangeWiFiStationState(kWiFiStationState_Connecting); - } - } - - // Otherwise arrange another connection attempt at a suitable point in the future. - else - { - System::Clock::Timestamp timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval) - now; - - ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", - System::Clock::Milliseconds32(timeToNextConnect).count()); - - ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); - } - } + ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); + WifiInterface::GetInstance().TriggerDisconnection(); + ChangeWiFiStationState(kWiFiStationState_Disconnecting); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() + // next time DriveStationState() will be called, the station will be in the NotConnected state + return; } -exit: + // if the station is provisioned and not connected, + // connect it to the access point using the credentials from the staging + // network + VerifyOrReturn(IsWiFiStationProvisioned(), ChipLogDetail(DeviceLayer, "WiFi station is not provisioned")); + + System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); + System::Clock::Timestamp timeToNextConnect = System::Clock::kZero; - ChipLogProgress(DeviceLayer, "Done driving station state, nothing else to do..."); + ChipLogDetail(DeviceLayer, "WiFi station state: %s", WiFiStationStateToStr(mWiFiStationState)); + switch (mWiFiStationState) + { + case kWiFiStationState_NotConnected: { + // reset the last connection failure time and reconnect interval + mLastStationConnectFailTime = System::Clock::kZero; + mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); + // connect the station to the access point using the credentials from the staging network + err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); + ChangeWiFiStationState(kWiFiStationState_Connecting); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() + } + break; + case kWiFiStationState_Connected: + case kWiFiStationState_Connecting_Succeeded: { + // if the station is connected or connecting succeeded, + // reset the last connection failure time and reconnect interval + mLastStationConnectFailTime = System::Clock::kZero; + mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); + } + break; + case kWiFiStationState_Connecting_Failed: { + // if the station is connecting failed, + // arrange another connection attempt at a suitable point in the future + mLastStationConnectFailTime = now; + timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval) - now; + // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of reconnect + // attempts thus saving power + mWiFiStationReconnectInterval += mWiFiStationReconnectInterval; + ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", + System::Clock::Milliseconds32(timeToNextConnect).count()); + ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); + } + break; + default: { + ChipLogDetail(DeviceLayer, "drive station state not handled: %s", WiFiStationStateToStr(mWiFiStationState)); + } + break; + } // Kick-off any pending network scan that might have been deferred due to the activity // of the WiFi station. } @@ -358,17 +305,32 @@ void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) { - if (mWiFiStationState != newState) + VerifyOrReturn(mWiFiStationState != newState, + ChipLogDetail(DeviceLayer, "WiFi station state is already %s", WiFiStationStateToStr(newState))); + ChipLogProgress(DeviceLayer, "WiFi station state change: %s -> %s", WiFiStationStateToStr(mWiFiStationState), + WiFiStationStateToStr(newState)); + // Commit the state before notifying. OnStationConnected() calls + // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. + mWiFiStationState = newState; + switch (newState) { - ChipLogProgress(DeviceLayer, "WiFi station state change: %s -> %s", WiFiStationStateToStr(mWiFiStationState), - WiFiStationStateToStr(newState)); - mWiFiStationState = newState; - - NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); - // Cannot use the driver if the instance is not initialized. - VerifyOrDie(nwDriver != nullptr); // should never be null - nwDriver->UpdateNetworkingStatus(); + case kWiFiStationState_Connected: + OnStationConnected(); // alert other components of the new state + break; + case kWiFiStationState_NotConnected: + OnStationDisconnected(); // alert other components of the new state + break; + default: + ChipLogDetail(DeviceLayer, "WiFi station state not notifying: %s", WiFiStationStateToStr(newState)); + break; } + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + + // TODO: Remove this once the WiFi driver is updated to use the new state machine + NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); + // Cannot use the driver if the instance is not initialized. + VerifyOrDie(nwDriver != nullptr); // should never be null + nwDriver->UpdateNetworkingStatus(); } void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) From 77978db2c47400b841807dd9c962011752af4735 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 18:30:46 +0530 Subject: [PATCH 13/67] Add method to retrieve last disconnection reason in WifiInterface. Initialize mLastDisconnectionReason to kUnknownError for improved error tracking. --- src/platform/silabs/wifi/WifiInterface.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index b8e693d2c93..14742c1cc72 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -332,6 +332,15 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface */ void ResetConnectionRetryInterval(); + /** + * @brief Function returns the last disconnection reason + * + * @param[out] reason last disconnection reason + */ + virtual void GetLastDisconnectionReason(WifiDisconnectionReasons & reason) { + reason = mLastDisconnectionReason; + }; + protected: /** * @brief Function notifies the PlatformManager that an IPv6 event occured on the WiFi interface. @@ -396,6 +405,8 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface */ void CancelConnectionAttempt(); + WifiDisconnectionReasons mLastDisconnectionReason = WifiDisconnectionReasons::kUnknownError; + bool mHasNotifiedIPv6 = false; #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 bool mHasNotifiedIPv4 = false; From c6aca2485e9b91c6c13e4413f39a7df8ab195125 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 12 Sep 2026 18:37:30 +0530 Subject: [PATCH 14/67] Improve readability --- .../silabs/NetworkCommissioningWiFiDriver.cpp | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 4aa0958db3a..76f5998aabe 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -53,6 +53,7 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC #if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING memcpy(&mSavedNetwork.ssid, SL_WIFI_SSID, sizeof(SL_WIFI_SSID)); mSavedNetwork.ssidLen = sizeof(SL_WIFI_SSID); + err = CHIP_NO_ERROR; #endif // SL_ONNETWORK_PAIRING } @@ -60,14 +61,15 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiPSK, mSavedNetwork.key, sizeof(mSavedNetwork.key), mSavedNetwork.keyLen); -if (err != CHIP_NO_ERROR) -{ + if (err != CHIP_NO_ERROR) + { #if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING - memcpy(&mSavedNetwork.key, SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); - mSavedNetwork.keyLen = sizeof(SL_WIFI_PSK); - err = CHIP_NO_ERROR; + memcpy(&mSavedNetwork.key, SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); + mSavedNetwork.keyLen = sizeof(SL_WIFI_PSK); + + err = CHIP_NO_ERROR; #endif // SL_ONNETWORK_PAIRING -} + } VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); mStagingNetwork = mSavedNetwork; err = ConnectWiFiNetwork(reinterpret_cast(mSavedNetwork.ssid), mSavedNetwork.ssidLen, @@ -183,17 +185,8 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, // TODO: Re-write implementation with proper driver based callback void SlWiFiDriver::UpdateNetworkingStatus() { - if (mpStatusChangeCallback == nullptr) - { - ChipLogError(NetworkProvisioning, "networkStatusChangeCallback is nil"); - return; - } - - if (mStagingNetwork.ssidLen == 0) - { - ChipLogError(NetworkProvisioning, "ssidLen is 0"); - return; - } + VerifyOrReturn(mpStatusChangeCallback != nullptr); + VerifyOrReturn(mStagingNetwork.ssidLen != 0); ByteSpan networkId = ByteSpan((const unsigned char *) mStagingNetwork.ssid, mStagingNetwork.ssidLen); if (!WifiInterface::GetInstance().IsStationConnected()) From 9d61b3e2e74319862f194939f9c64f8b275ede90 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:43:39 +0530 Subject: [PATCH 15/67] refactor(silabs-wifi): move reconnect to ConnectivityMgr Map join/disconnect failures to disconnection reasons and let ConnectivityManager drive station state. --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 8b3e97c9487..e213f1545dd 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -231,9 +231,6 @@ void ConnectivityManagerImpl::DriveStationState() switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { - // reset the last connection failure time and reconnect interval - mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); // connect the station to the access point using the credentials from the staging network err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network VerifyOrReturn(err == CHIP_NO_ERROR, @@ -242,12 +239,9 @@ void ConnectivityManagerImpl::DriveStationState() // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() } break; - case kWiFiStationState_Connected: - case kWiFiStationState_Connecting_Succeeded: { - // if the station is connected or connecting succeeded, - // reset the last connection failure time and reconnect interval - mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); + case kWiFiStationState_Connecting: { + // Connection attempt already in progress; wait for connect/disconnect platform events. + return; } break; case kWiFiStationState_Connecting_Failed: { @@ -314,12 +308,25 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) mWiFiStationState = newState; switch (newState) { + case kWiFiStationState_Connecting_Succeeded: + // if the station is connected or connecting succeeded, + // reset the last connection failure time and reconnect interval + mLastStationConnectFailTime = System::Clock::kZero; + mWiFiStationReconnectCount = 0; + // intentionally fall through to the connected state case kWiFiStationState_Connected: OnStationConnected(); // alert other components of the new state break; + case kWiFiStationState_NotConnected: + // reset the last connection failure time and reconnect interval + mLastStationConnectFailTime = System::Clock::kZero; + mWiFiStationReconnectCount = 0; + // intentionally fall through to the failed state + case kWiFiStationState_Connecting_Failed: OnStationDisconnected(); // alert other components of the new state break; + default: ChipLogDetail(DeviceLayer, "WiFi station state not notifying: %s", WiFiStationStateToStr(newState)); break; From 2fcfdf29ff0f84440e36f448a3df2d5c2c24aa88 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:52:51 +0530 Subject: [PATCH 16/67] refactor(silabs-wifi): move reconnect to ConnectivityMgr Map join/disconnect failures to disconnection reasons and let ConnectivityManager drive station state. --- src/platform/silabs/ConnectivityManagerImpl.h | 1 + .../silabs/ConnectivityManagerImpl_WIFI.cpp | 32 +++++++-- .../silabs/NetworkCommissioningWiFiDriver.cpp | 5 +- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 38 ++++++++-- src/platform/silabs/wifi/WifiInterface.cpp | 70 ------------------- src/platform/silabs/wifi/WifiInterface.h | 22 ------ 6 files changed, 65 insertions(+), 103 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 49e32a30981..4bb7bfa7463 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -123,6 +123,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, // variables for tracking the last connection failure time and reconnect interval System::Clock::Timestamp mLastStationConnectFailTime; System::Clock::Timeout mWiFiStationReconnectInterval; + uint8_t mWiFiStationReconnectCount; // flags for tracking the internet connectivity state BitFlags mFlags; diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index e213f1545dd..1effd1d37b0 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -60,6 +60,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() mWiFiStationState = kWiFiStationState_NotConnected; mLastStationConnectFailTime = System::Clock::kZero; mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); + mWiFiStationReconnectCount = 1; mFlags.ClearAll(); // TODO Initialize the Chip Addressing and Routing Module. @@ -96,7 +97,16 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) case to_underlying(WifiInterface::WifiEvent::kDisconnect): ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_DISCONNECTED"); - ChangeWiFiStationState(kWiFiStationState_NotConnected); + switch (event->Platform.event.WFXSystemEvent.data.disconnectEvent.body.reason) + { + // User initiated disconnection + case to_underlying(WifiInterface::WifiDisconnectionReasons::kApplication): + ChangeWiFiStationState(kWiFiStationState_NotConnected); + break; + default: + ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); + break; + } break; case to_underlying(WifiInterface::WifiEvent::kGotIPv4): @@ -248,10 +258,22 @@ void ConnectivityManagerImpl::DriveStationState() // if the station is connecting failed, // arrange another connection attempt at a suitable point in the future mLastStationConnectFailTime = now; - timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval) - now; + + // TODO: Revisit this logic // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of reconnect // attempts thus saving power - mWiFiStationReconnectInterval += mWiFiStationReconnectInterval; + // TODO: Guard this with commissioning mode flag + // mWiFiStationReconnectCount++; + // if ((mWiFiStationReconnectInterval * mWiFiStationReconnectCount) > + // CHIP_DEVICE_CONFIG_WIFI_STATION_MAX_RECONNECT_INTERVAL) + // { + // mWiFiStationReconnectCount--; + // } + + // Reset the station state to NotConnected to start a new connection attempt + mWiFiStationState = kWiFiStationState_NotConnected; + timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval * mWiFiStationReconnectCount) - now; + // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); @@ -312,7 +334,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) // if the station is connected or connecting succeeded, // reset the last connection failure time and reconnect interval mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectCount = 0; + mWiFiStationReconnectCount = 1; // intentionally fall through to the connected state case kWiFiStationState_Connected: OnStationConnected(); // alert other components of the new state @@ -321,7 +343,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) case kWiFiStationState_NotConnected: // reset the last connection failure time and reconnect interval mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectCount = 0; + mWiFiStationReconnectCount = 1; // intentionally fall through to the failed state case kWiFiStationState_Connecting_Failed: OnStationDisconnected(); // alert other components of the new state diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 76f5998aabe..f4e121d51f3 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -174,8 +174,7 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, wifiConfig.security.Set(chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap::kWpa2Personal); ChipLogProgress(NetworkProvisioning, "Setting up connection for WiFi SSID: %s", NullTerminated(ssid, ssidLen).c_str()); - // Resetting the retry connection state machine for a new access point connection - WifiInterface::GetInstance().ResetConnectionRetryInterval(); + ReturnErrorOnFailure(WifiInterface::GetInstance().SetWifiCredentials(wifiConfig)); ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled)); ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Enabled)); @@ -192,6 +191,7 @@ void SlWiFiDriver::UpdateNetworkingStatus() if (!WifiInterface::GetInstance().IsStationConnected()) { // TODO: https://github.com/project-chip/connectedhomeip/issues/26861 + // TODO: use the mLastDisconnectionReason to set the networking status mpStatusChangeCallback->OnNetworkingStatusChange(Status::kUnknownError, MakeOptional(networkId), MakeOptional(static_cast(SL_STATUS_FAIL))); return; @@ -229,6 +229,7 @@ void SlWiFiDriver::ConnectNetwork(ByteSpan networkId, ConnectCallback * callback { ChipLogError(NetworkProvisioning, "Failed to connect to WiFi network: %" CHIP_ERROR_FORMAT, err.Format()); mpConnectCallback = nullptr; + // TODO: use the mLastDisconnectionReason to set the networking status callback->OnResult(networkingStatus, CharSpan(), 0); } } diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 32c318c5a95..b95b8491596 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -709,7 +709,22 @@ sl_status_t WifiInterfaceImpl::JoinWifiNetwork(void) #endif // SL_MATTER_NEUTRAL_LESS_SWITCH_WIFI wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnecting).Clear(WifiInterface::WifiState::kStationConnected); - ScheduleConnectionAttempt(); + switch (status) + { + case SL_STATUS_SI91X_JOIN_AUTHENTICATION_FAILED: + mLastDisconnectionReason = WifiDisconnectionReasons::kWPACouterMeasures; + break; + case SL_STATUS_SI91X_NO_AP_FOUND: + mLastDisconnectionReason = WifiDisconnectionReasons::kAccessPointLost; + break; + case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_FROM_AP: + mLastDisconnectionReason = WifiDisconnectionReasons::kAccessPoint; + break; + default: + mLastDisconnectionReason = WifiDisconnectionReasons::kUnknownError; + break; + } + WifiInterface::NotifyDisconnection(mLastDisconnectionReason); return status; } @@ -742,7 +757,22 @@ sl_status_t WifiInterfaceImpl::JoinCallback(sl_wifi_event_t event, char * result ChipLogError(DeviceLayer, "JoinCallback: failed: 0x%lx", status); wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnected); - mInstance.ScheduleConnectionAttempt(); + WifiDisconnectionReasons reason = WifiDisconnectionReasons::kUnknownError; + switch (status) + { + case SL_STATUS_SI91X_JOIN_AUTHENTICATION_FAILED: + reason = WifiDisconnectionReasons::kWPACouterMeasures; + break; + case SL_STATUS_SI91X_NO_AP_FOUND: + reason = WifiDisconnectionReasons::kAccessPointLost; + break; + default: + break; + } + + WifiInterfaceImpl & self = WifiInterfaceImpl::GetInstance(); + self.mLastDisconnectionReason = reason; + self.NotifyDisconnection(reason); } return status; @@ -848,6 +878,8 @@ sl_status_t WifiInterfaceImpl::TriggerPlatformWifiDisconnection() sl_status_t status = sl_net_down(SL_NET_WIFI_CLIENT_INTERFACE); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_down failed: 0x%lx", status)); + mLastDisconnectionReason = WifiDisconnectionReasons::kApplication; + WifiInterface::NotifyDisconnection(mLastDisconnectionReason); return SL_STATUS_OK; } @@ -893,8 +925,6 @@ CHIP_ERROR WifiInterfaceImpl::InitLitPrecheckInReconnectTimer() CHIP_ERROR WifiInterfaceImpl::ConfigureLITConnect() { - ResetConnectionRetryInterval(); - VerifyOrReturnError(IsWifiProvisioned(), CHIP_NO_ERROR); VerifyOrReturnError(!IsStationConnected(), CHIP_NO_ERROR); diff --git a/src/platform/silabs/wifi/WifiInterface.cpp b/src/platform/silabs/wifi/WifiInterface.cpp index 74567ed6263..b5e60699b20 100644 --- a/src/platform/silabs/wifi/WifiInterface.cpp +++ b/src/platform/silabs/wifi/WifiInterface.cpp @@ -36,29 +36,6 @@ extern WfxRsi_t wfx_rsi; // As such we can't depend on the platform here as well extern void HandleWFXSystemEvent(sl_wfx_generic_message_t * eventData); -namespace { - -constexpr uint8_t kWlanMinRetryIntervalsInSec = 1; -constexpr uint8_t kWlanMaxRetryIntervalsInSec = 60; -uint8_t retryInterval = kWlanMinRetryIntervalsInSec; - -/** - * @brief Retry timer callback that triggers a reconnection attempt - * - * TODO: The structure of the retry needs to be redone - * - * @param arg - */ -void RetryConnectionTimerHandler(void * arg) -{ - if (chip::DeviceLayer::Silabs::WifiInterface::GetInstance().ConnectToAccessPoint() != CHIP_NO_ERROR) - { - ChipLogError(DeviceLayer, "ConnectToAccessPoint() failed."); - } -} - -} // namespace - namespace chip { namespace DeviceLayer { namespace Silabs { @@ -107,9 +84,6 @@ void WifiInterface::NotifyConnection(const MacAddress & ap) evt.body.channel = wfx_rsi.ap_chan; #endif std::copy(ap.begin(), ap.end(), evt.body.mac); - // Resetting the retry connection state machine for a successful connection - // NOTE: This is required in case an access point gets disconnected after a successful connection. - ResetConnectionRetryInterval(); HandleWFXSystemEvent((sl_wfx_generic_message_t *) &evt); } @@ -126,11 +100,6 @@ void WifiInterface::NotifyWifiTaskInitialized(void) { sl_wfx_startup_ind_t evt = { 0 }; - // TODO: We should move this to the init function and not the notification function - // Creating a timer which will be used to retry connection with AP - mRetryTimer = osTimerNew(RetryConnectionTimerHandler, osTimerOnce, NULL, NULL); - VerifyOrReturn(mRetryTimer != nullptr); - evt.header.id = to_underlying(WifiEvent::kStartUp); evt.header.length = sizeof evt; evt.body.status = 0; @@ -141,45 +110,6 @@ void WifiInterface::NotifyWifiTaskInitialized(void) HandleWFXSystemEvent((sl_wfx_generic_message_t *) &evt); } - -// TODO: The retry stategy needs to be re-worked -void WifiInterface::ScheduleConnectionAttempt() -{ - if (retryInterval > kWlanMaxRetryIntervalsInSec) - { - retryInterval = kWlanMaxRetryIntervalsInSec; - } - - if (osTimerStart(mRetryTimer, pdMS_TO_TICKS(retryInterval * 1000)) != osOK) - { - ChipLogProgress(DeviceLayer, "Failed to start retry timer"); - // Sending the join command if retry timer failed to start - if (ConnectToAccessPoint() != CHIP_NO_ERROR) - { - ChipLogError(DeviceLayer, "ConnectToAccessPoint() failed."); - } - - return; - } - - ChipLogProgress(DeviceLayer, "ScheduleConnectionAttempt : Next attempt after %d Seconds", retryInterval); - retryInterval += retryInterval; -} - -void WifiInterface::CancelConnectionAttempt() -{ - if (osTimerIsRunning(mRetryTimer)) - { - osTimerStop(mRetryTimer); - } -} - -void WifiInterface::ResetConnectionRetryInterval() -{ - ChipLogDetail(DeviceLayer, "ResetConnectionRetryInterval: Resetting state to default"); - retryInterval = kWlanMinRetryIntervalsInSec; -} - } // namespace Silabs } // namespace DeviceLayer } // namespace chip diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index 14742c1cc72..9b06d757947 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -327,11 +327,6 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface return static_cast(1UL << chip::to_underlying(chip::app::Clusters::NetworkCommissioning::WiFiBandEnum::k2g4)); } - /** - * @brief Function resets reconnection attempt interval back to the minimum value - */ - void ResetConnectionRetryInterval(); - /** * @brief Function returns the last disconnection reason * @@ -391,29 +386,12 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface */ void NotifyWifiTaskInitialized(void); - /** - * @brief Function schedules a reconnection attempt with the Access Point - * - * @note The retry interval increases exponentially with each attempt, starting from a minimum value and doubling each time, - * up to a maximum value. For example, if the initial retry interval is 1 second, the subsequent intervals will be 2 - * seconds, 4 seconds, 8 seconds, and so on, until the maximum retry interval is reached. - */ - void ScheduleConnectionAttempt(); - - /** - * @brief Function cancels the on-going reconnection attempts - */ - void CancelConnectionAttempt(); - WifiDisconnectionReasons mLastDisconnectionReason = WifiDisconnectionReasons::kUnknownError; bool mHasNotifiedIPv6 = false; #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 bool mHasNotifiedIPv4 = false; #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 - -private: - osTimerId_t mRetryTimer; }; } // namespace Silabs From d969a5599d55c1114e3f5abec2d5d467d306de66 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sun, 13 Sep 2026 21:27:23 +0530 Subject: [PATCH 17/67] refactor(silabs-wifi): simplify logging and error handling in WiFi station state management --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 1effd1d37b0..277b9475ccf 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -140,8 +140,7 @@ bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void) CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val) { // If the new WiFi station mode is the same as the current WiFi station mode, return success. - VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR, - ChipLogDetail(DeviceLayer, "WiFi station mode is already %s", WiFiStationModeToStr(val))); + VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR); ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), WiFiStationModeToStr(val)); @@ -237,7 +236,6 @@ void ConnectivityManagerImpl::DriveStationState() System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); System::Clock::Timestamp timeToNextConnect = System::Clock::kZero; - ChipLogDetail(DeviceLayer, "WiFi station state: %s", WiFiStationStateToStr(mWiFiStationState)); switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { @@ -321,8 +319,7 @@ void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) { - VerifyOrReturn(mWiFiStationState != newState, - ChipLogDetail(DeviceLayer, "WiFi station state is already %s", WiFiStationStateToStr(newState))); + VerifyOrReturn(mWiFiStationState != newState); ChipLogProgress(DeviceLayer, "WiFi station state change: %s -> %s", WiFiStationStateToStr(mWiFiStationState), WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls @@ -350,7 +347,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) break; default: - ChipLogDetail(DeviceLayer, "WiFi station state not notifying: %s", WiFiStationStateToStr(newState)); + ChipLogDetail(DeviceLayer, "WiFi station state not driving: %s", WiFiStationStateToStr(newState)); break; } TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); From e1cf814ffeb970a0ab0f83a899794e996cdbb378 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sun, 13 Sep 2026 22:07:23 +0530 Subject: [PATCH 18/67] refactor(silabs-wifi): enhance WiFi station mode management with state-based handling and disconnection logic --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 277b9475ccf..321256330d6 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -146,7 +146,26 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF WiFiStationModeToStr(val)); mWiFiStationMode = val; - VerifyOrReturnError(WifiInterface::GetInstance().EnableStationMode() == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); + switch (mWiFiStationMode) + { + case kWiFiStationMode_Disabled: { + // disconnect if wifi is provisioned + if (IsWiFiStationProvisioned()) + { + WifiInterface::GetInstance().TriggerDisconnection(); + ChangeWiFiStationState(kWiFiStationState_Disconnecting); + } + // TODO: add logic for disabling WiFi station + } + break; + case kWiFiStationMode_Enabled: { + VerifyOrReturnError(WifiInterface::GetInstance().EnableStationMode() == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); + } + break; + default: + // kWiFiStationMode_Application + break; + } TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); return CHIP_NO_ERROR; } From 779f0314e02123beb9e8a1fd910ad701c3d55f63 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Mon, 14 Sep 2026 22:32:32 +0530 Subject: [PATCH 19/67] refactor(silabs-wifi): implement mapping of disconnection reasons to NetworkCommissioningStatusEnum and enhance disconnection notification logic --- .../silabs/NetworkCommissioningWiFiDriver.cpp | 1 + .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 83 ++++++++++++------- .../silabs/wifi/SiWx/WifiInterfaceImpl.h | 2 +- src/platform/silabs/wifi/WifiInterface.cpp | 11 ++- src/platform/silabs/wifi/WifiInterface.h | 29 +++++-- 5 files changed, 84 insertions(+), 42 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index f4e121d51f3..b4730e7d7ee 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -203,6 +203,7 @@ void SlWiFiDriver::OnConnectWiFiNetwork() { if (mpConnectCallback) { + // TODO: use the mLastDisconnectionReason to set the networking status mpConnectCallback->OnResult(Status::kSuccess, CharSpan(), 0); mpConnectCallback = nullptr; } diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index b95b8491596..abefb6c87f5 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -709,21 +709,7 @@ sl_status_t WifiInterfaceImpl::JoinWifiNetwork(void) #endif // SL_MATTER_NEUTRAL_LESS_SWITCH_WIFI wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnecting).Clear(WifiInterface::WifiState::kStationConnected); - switch (status) - { - case SL_STATUS_SI91X_JOIN_AUTHENTICATION_FAILED: - mLastDisconnectionReason = WifiDisconnectionReasons::kWPACouterMeasures; - break; - case SL_STATUS_SI91X_NO_AP_FOUND: - mLastDisconnectionReason = WifiDisconnectionReasons::kAccessPointLost; - break; - case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_FROM_AP: - mLastDisconnectionReason = WifiDisconnectionReasons::kAccessPoint; - break; - default: - mLastDisconnectionReason = WifiDisconnectionReasons::kUnknownError; - break; - } + mLastDisconnectionReason = static_cast(status); WifiInterface::NotifyDisconnection(mLastDisconnectionReason); return status; @@ -757,22 +743,10 @@ sl_status_t WifiInterfaceImpl::JoinCallback(sl_wifi_event_t event, char * result ChipLogError(DeviceLayer, "JoinCallback: failed: 0x%lx", status); wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnected); - WifiDisconnectionReasons reason = WifiDisconnectionReasons::kUnknownError; - switch (status) - { - case SL_STATUS_SI91X_JOIN_AUTHENTICATION_FAILED: - reason = WifiDisconnectionReasons::kWPACouterMeasures; - break; - case SL_STATUS_SI91X_NO_AP_FOUND: - reason = WifiDisconnectionReasons::kAccessPointLost; - break; - default: - break; - } - + uint16_t reason = static_cast(status); WifiInterfaceImpl & self = WifiInterfaceImpl::GetInstance(); self.mLastDisconnectionReason = reason; - self.NotifyDisconnection(reason); + self.NotifyDisconnection(self.mLastDisconnectionReason); } return status; @@ -878,7 +852,7 @@ sl_status_t WifiInterfaceImpl::TriggerPlatformWifiDisconnection() sl_status_t status = sl_net_down(SL_NET_WIFI_CLIENT_INTERFACE); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_down failed: 0x%lx", status)); - mLastDisconnectionReason = WifiDisconnectionReasons::kApplication; + mLastDisconnectionReason = static_cast(status); WifiInterface::NotifyDisconnection(mLastDisconnectionReason); return SL_STATUS_OK; } @@ -1260,6 +1234,55 @@ CHIP_ERROR WifiInterfaceImpl::ConnectToAccessPoint() return CHIP_NO_ERROR; } +chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum +WifiInterfaceImpl::MapToNetworkCommissioningStatusEnum(uint32_t reason) +{ + /* + kSuccess + kOutOfRange + kBoundsExceeded + kNetworkIDNotFound + kDuplicateNetworkID + kNetworkNotFound + kRegulatoryError + kAuthFailure + kUnsupportedSecurity + kOtherConnectionFailure + kIPV6Failed + kIPBindFailed + kUnknownError + */ + using Status = chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum; + + switch (reason) + { + case SL_STATUS_OK: + return Status::kSuccess; + case SL_STATUS_SI91X_NO_AP_FOUND: + case SL_STATUS_SI91X_BEACON_MISSED_FROM_AP_DURING_JOIN: + case SL_STATUS_SI91X_REJOIN_FAILURE: + return Status::kNetworkNotFound; + case SL_STATUS_SI91X_INVALID_CHANNEL: + return Status::kRegulatoryError; + case SL_STATUS_SI91X_INVALID_PSK_IN_WEP_SECURITY: + case SL_STATUS_SI91X_DEAUTHENTICATION_RECEIVED_FROM_AP: + case SL_STATUS_SI91X_ASSOCIATION_FAILED: + case SL_STATUS_SI91X_JOIN_AUTHENTICATION_FAILED: + case SL_STATUS_SI91X_MAX_BEACON_MISCOUNT: + case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_SUPPLICANT: + case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_FROM_AP: + case SL_STATUS_SI91X_AUTHENTICATION_TIMEOUT: + return Status::kAuthFailure; + case SL_STATUS_SI91X_INVALID_SECURITY_MODE_IN_JOIN_COMMAND: + return Status::kUnsupportedSecurity; + case SL_STATUS_SI91X_ASSOCIATION_TIMEOUT: + case SL_STATUS_SI91X_FOUR_WAY_HANDSHAKE_FAILED: + return Status::kOtherConnectionFailure; + default: + return Status::kUnknownError; + } +} + bool WifiInterfaceImpl::HasAnIPv4Address() { bool hasIPv4 = false; diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h index 2f520b9cad2..de82fb10758 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h @@ -70,7 +70,7 @@ class WifiInterfaceImpl final : public WifiInterface CHIP_ERROR GetAccessPointInfo(chip::DeviceLayer::NetworkCommissioning::WiFiScanResponse & info) override; CHIP_ERROR GetAccessPointExtendedInfo(wfx_wifi_scan_ext_t & info) override; CHIP_ERROR ResetCounters() override; - + chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum MapToNetworkCommissioningStatusEnum(uint32_t reason) override; #if CHIP_CONFIG_ENABLE_ICD_SERVER CHIP_ERROR ConfigureBroadcastFilter(bool enableBroadcastFilter) override; CHIP_ERROR ConfigurePowerSave(PowerSaveInterface::PowerSaveConfiguration configuration, uint32_t listenInterval) override; diff --git a/src/platform/silabs/wifi/WifiInterface.cpp b/src/platform/silabs/wifi/WifiInterface.cpp index b5e60699b20..14f9cfcdc74 100644 --- a/src/platform/silabs/wifi/WifiInterface.cpp +++ b/src/platform/silabs/wifi/WifiInterface.cpp @@ -65,12 +65,14 @@ void WifiInterface::NotifyIPv4Change(bool gotIPv4Addr) } #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 -void WifiInterface::NotifyDisconnection(WifiDisconnectionReasons reason) +void WifiInterface::NotifyDisconnection(uint32_t reason) { sl_wfx_disconnect_ind_t evt = {}; evt.header.id = to_underlying(WifiEvent::kDisconnect); evt.header.length = sizeof evt; - evt.body.reason = to_underlying(reason); + evt.body.reason = static_cast(mLastDisconnectionReason); + + ChipLogDetail(DeviceLayer, "WiFi disconnection reason: 0x%lx", MapToNetworkCommissioningStatusEnum(mLastDisconnectionReason)); HandleWFXSystemEvent((sl_wfx_generic_message_t *) &evt); } @@ -110,6 +112,11 @@ void WifiInterface::NotifyWifiTaskInitialized(void) HandleWFXSystemEvent((sl_wfx_generic_message_t *) &evt); } + +chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum WifiInterface::GetLastDisconnectionReason() +{ + return MapToNetworkCommissioningStatusEnum(mLastDisconnectionReason); +} } // namespace Silabs } // namespace DeviceLayer } // namespace chip diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index 9b06d757947..f00a5571004 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -328,13 +328,11 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface } /** - * @brief Function returns the last disconnection reason - * - * @param[out] reason last disconnection reason + * @brief Function returns the last disconnection reason by mapping platform error codes + * to the NetworkCommissioningStatusEnum value + * @return NetworkCommissioningStatusEnum value for the last disconnection reason */ - virtual void GetLastDisconnectionReason(WifiDisconnectionReasons & reason) { - reason = mLastDisconnectionReason; - }; + chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum GetLastDisconnectionReason(); protected: /** @@ -363,10 +361,12 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface /** * @brief Function notifies the PlatformManager that a disconnection event occurred + * The function will use the `GetLastDisconnectionReason()` function to determine + * the reason for the disconnection and notify the PlatformManager. * - * @param reason reason for the disconnection + * @return void */ - void NotifyDisconnection(WifiDisconnectionReasons reason); + void NotifyDisconnection(uint32_t reason); /** * @brief Function notifies the PlatformManager that a connection event occurred @@ -386,12 +386,23 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface */ void NotifyWifiTaskInitialized(void); - WifiDisconnectionReasons mLastDisconnectionReason = WifiDisconnectionReasons::kUnknownError; + /** + * @brief Function maps the disconnection reason to the NetworkCommissioningStatusEnum value + * + * @param reason disconnection reason + * @return NetworkCommissioningStatusEnum value for the disconnection reason + */ + virtual chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum + MapToNetworkCommissioningStatusEnum(uint32_t reason) + { + return chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum::kUnknownError; + } bool mHasNotifiedIPv6 = false; #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 bool mHasNotifiedIPv4 = false; #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 + uint32_t mLastDisconnectionReason = 0; }; } // namespace Silabs From aeffd1632c3c14f7db1d0f64c7a26506a1af0bfc Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 14:00:29 +0530 Subject: [PATCH 20/67] refactor(silabs-wifi): introduce ResetReconnectionWiFiStationState method to streamline reconnection logic in WiFi station state management --- src/platform/silabs/ConnectivityManagerImpl.h | 1 + .../silabs/ConnectivityManagerImpl_WIFI.cpp | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 4bb7bfa7463..537e3a3cc49 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -132,6 +132,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void OnStationDisconnected(void); void ChangeWiFiStationState(WiFiStationState newState); static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState); + void ResetReconnectionWiFiStationState(void); void UpdateInternetConnectivityState(void); #endif diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 321256330d6..d438f09b7b1 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -331,6 +331,12 @@ void ConnectivityManagerImpl::OnStationDisconnected() (void) PlatformMgr().PostEvent(&event); } +void ConnectivityManagerImpl::ResetReconnectionWiFiStationState() +{ + mLastStationConnectFailTime = System::Clock::kZero; + mWiFiStationReconnectCount = 1; +} + void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, void * aAppState) { sInstance.DriveStationState(); @@ -347,20 +353,19 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) switch (newState) { case kWiFiStationState_Connecting_Succeeded: - // if the station is connected or connecting succeeded, - // reset the last connection failure time and reconnect interval - mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectCount = 1; - // intentionally fall through to the connected state + ResetReconnectionWiFiStationState(); + OnStationConnected(); + break; + case kWiFiStationState_Connected: OnStationConnected(); // alert other components of the new state break; case kWiFiStationState_NotConnected: - // reset the last connection failure time and reconnect interval - mLastStationConnectFailTime = System::Clock::kZero; - mWiFiStationReconnectCount = 1; - // intentionally fall through to the failed state + ResetReconnectionWiFiStationState(); + OnStationDisconnected(); + break; + case kWiFiStationState_Connecting_Failed: OnStationDisconnected(); // alert other components of the new state break; From 058fb86e3acb0bebf30232376ab7b7808ea8cf76 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:21:21 +0530 Subject: [PATCH 21/67] refactor(silabs-wifi): add stub for disabling station mode --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 12 ++++++++---- src/platform/silabs/wifi/WifiInterface.h | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index d438f09b7b1..ff919169a15 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -146,6 +146,7 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF WiFiStationModeToStr(val)); mWiFiStationMode = val; + CHIP_ERROR err = CHIP_NO_ERROR; switch (mWiFiStationMode) { case kWiFiStationMode_Disabled: { @@ -154,20 +155,23 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF { WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() } - // TODO: add logic for disabling WiFi station + err = WifiInterface::GetInstance().DisableStationMode(); + VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_NOT_IMPLEMENTED, err); } break; case kWiFiStationMode_Enabled: { - VerifyOrReturnError(WifiInterface::GetInstance().EnableStationMode() == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); + err = WifiInterface::GetInstance().EnableStationMode(); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); } break; default: // kWiFiStationMode_Application break; } - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - return CHIP_NO_ERROR; + err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + return err; } CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationReconnectInterval(System::Clock::Timeout timeoutMs) diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index f00a5571004..e5c303b7f98 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -227,6 +227,14 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface */ virtual CHIP_ERROR EnableStationMode() = 0; + /** + * @brief Disables the Wi-Fi station mode + * + * @return CHIP_ERROR CHIP_NO_ERROR if the station mode was successfully disabled + * CHIP_ERROR_INTERNAL if the station mode could not be disabled + */ + virtual CHIP_ERROR DisableStationMode() { return CHIP_ERROR_NOT_IMPLEMENTED; } + /** * @brief Triggers the device to disconnect from the connected Wi-Fi network * From fe952326888049c20b44f86628a9e06289b4c193 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 16:00:14 +0530 Subject: [PATCH 22/67] clean up comments --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index ff919169a15..1daaa186b4f 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -281,15 +281,10 @@ void ConnectivityManagerImpl::DriveStationState() mLastStationConnectFailTime = now; // TODO: Revisit this logic - // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of reconnect - // attempts thus saving power + // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of + // reconnect attempts thus saving power // TODO: Guard this with commissioning mode flag // mWiFiStationReconnectCount++; - // if ((mWiFiStationReconnectInterval * mWiFiStationReconnectCount) > - // CHIP_DEVICE_CONFIG_WIFI_STATION_MAX_RECONNECT_INTERVAL) - // { - // mWiFiStationReconnectCount--; - // } // Reset the station state to NotConnected to start a new connection attempt mWiFiStationState = kWiFiStationState_NotConnected; From 1279dc271c8d0554f81abe72b27e6ff89f7e8bb6 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 17:48:41 +0530 Subject: [PATCH 23/67] refactor(silabs-wifi): streamline disconnection handling by using direct status in notifications and improving reason retrieval --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 4 ++-- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 13 ++++++------- src/platform/silabs/wifi/WifiInterface.cpp | 4 +--- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 1daaa186b4f..ababacb02eb 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -97,10 +97,10 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) case to_underlying(WifiInterface::WifiEvent::kDisconnect): ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_DISCONNECTED"); - switch (event->Platform.event.WFXSystemEvent.data.disconnectEvent.body.reason) + switch (WifiInterface::GetInstance().GetLastDisconnectionReason()) { // User initiated disconnection - case to_underlying(WifiInterface::WifiDisconnectionReasons::kApplication): + case NetworkCommissioning::Status::kSuccess: ChangeWiFiStationState(kWiFiStationState_NotConnected); break; default: diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index abefb6c87f5..586d1b55261 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -709,8 +709,8 @@ sl_status_t WifiInterfaceImpl::JoinWifiNetwork(void) #endif // SL_MATTER_NEUTRAL_LESS_SWITCH_WIFI wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnecting).Clear(WifiInterface::WifiState::kStationConnected); - mLastDisconnectionReason = static_cast(status); - WifiInterface::NotifyDisconnection(mLastDisconnectionReason); + mLastDisconnectionReason = status; + WifiInterface::NotifyDisconnection(status); return status; } @@ -743,10 +743,9 @@ sl_status_t WifiInterfaceImpl::JoinCallback(sl_wifi_event_t event, char * result ChipLogError(DeviceLayer, "JoinCallback: failed: 0x%lx", status); wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnected); - uint16_t reason = static_cast(status); WifiInterfaceImpl & self = WifiInterfaceImpl::GetInstance(); - self.mLastDisconnectionReason = reason; - self.NotifyDisconnection(self.mLastDisconnectionReason); + self.mLastDisconnectionReason = status; + self.NotifyDisconnection(status); } return status; @@ -852,8 +851,8 @@ sl_status_t WifiInterfaceImpl::TriggerPlatformWifiDisconnection() sl_status_t status = sl_net_down(SL_NET_WIFI_CLIENT_INTERFACE); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_down failed: 0x%lx", status)); - mLastDisconnectionReason = static_cast(status); - WifiInterface::NotifyDisconnection(mLastDisconnectionReason); + mLastDisconnectionReason = status; + WifiInterface::NotifyDisconnection(status); return SL_STATUS_OK; } diff --git a/src/platform/silabs/wifi/WifiInterface.cpp b/src/platform/silabs/wifi/WifiInterface.cpp index 14f9cfcdc74..dd9847b38b8 100644 --- a/src/platform/silabs/wifi/WifiInterface.cpp +++ b/src/platform/silabs/wifi/WifiInterface.cpp @@ -70,9 +70,7 @@ void WifiInterface::NotifyDisconnection(uint32_t reason) sl_wfx_disconnect_ind_t evt = {}; evt.header.id = to_underlying(WifiEvent::kDisconnect); evt.header.length = sizeof evt; - evt.body.reason = static_cast(mLastDisconnectionReason); - - ChipLogDetail(DeviceLayer, "WiFi disconnection reason: 0x%lx", MapToNetworkCommissioningStatusEnum(mLastDisconnectionReason)); + evt.body.reason = static_cast(reason); HandleWFXSystemEvent((sl_wfx_generic_message_t *) &evt); } From d7bdf7e7c40fae1592b849f5512cdc39b7669266 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 17:49:12 +0530 Subject: [PATCH 24/67] refactor(silabs-wifi): simplify disconnection logic by consolidating disconnection handling into a single method --- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 586d1b55261..94ff5f490f6 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -912,9 +912,7 @@ CHIP_ERROR WifiInterfaceImpl::ConfigureLITConnect() CHIP_ERROR WifiInterfaceImpl::ConfigureLITDisconnect() { - CancelConnectionAttempt(); - wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnected); - TriggerPlatformWifiDisconnection(); + TriggerDisconnection(); return CHIP_NO_ERROR; } From 7f964979e3c41617a3b1dbc922a1421fb5fb95dd Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 20:08:01 +0530 Subject: [PATCH 25/67] refactor(silabs-wifi): update MapToNetworkCommissioningStatusEnum to use direct enum references for improved clarity --- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 33 +++++-------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 94ff5f490f6..f5627f6c239 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -1231,36 +1231,19 @@ CHIP_ERROR WifiInterfaceImpl::ConnectToAccessPoint() return CHIP_NO_ERROR; } -chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum -WifiInterfaceImpl::MapToNetworkCommissioningStatusEnum(uint32_t reason) +NetworkCommissioningStatusEnum WifiInterfaceImpl::MapToNetworkCommissioningStatusEnum(uint32_t reason) { - /* - kSuccess - kOutOfRange - kBoundsExceeded - kNetworkIDNotFound - kDuplicateNetworkID - kNetworkNotFound - kRegulatoryError - kAuthFailure - kUnsupportedSecurity - kOtherConnectionFailure - kIPV6Failed - kIPBindFailed - kUnknownError - */ - using Status = chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum; switch (reason) { case SL_STATUS_OK: - return Status::kSuccess; + return NetworkCommissioningStatusEnum::kSuccess; case SL_STATUS_SI91X_NO_AP_FOUND: case SL_STATUS_SI91X_BEACON_MISSED_FROM_AP_DURING_JOIN: case SL_STATUS_SI91X_REJOIN_FAILURE: - return Status::kNetworkNotFound; + return NetworkCommissioningStatusEnum::kNetworkNotFound; case SL_STATUS_SI91X_INVALID_CHANNEL: - return Status::kRegulatoryError; + return NetworkCommissioningStatusEnum::kRegulatoryError; case SL_STATUS_SI91X_INVALID_PSK_IN_WEP_SECURITY: case SL_STATUS_SI91X_DEAUTHENTICATION_RECEIVED_FROM_AP: case SL_STATUS_SI91X_ASSOCIATION_FAILED: @@ -1269,14 +1252,14 @@ WifiInterfaceImpl::MapToNetworkCommissioningStatusEnum(uint32_t reason) case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_SUPPLICANT: case SL_STATUS_SI91X_DEAUTH_REQUEST_FROM_FROM_AP: case SL_STATUS_SI91X_AUTHENTICATION_TIMEOUT: - return Status::kAuthFailure; + return NetworkCommissioningStatusEnum::kAuthFailure; case SL_STATUS_SI91X_INVALID_SECURITY_MODE_IN_JOIN_COMMAND: - return Status::kUnsupportedSecurity; + return NetworkCommissioningStatusEnum::kUnsupportedSecurity; case SL_STATUS_SI91X_ASSOCIATION_TIMEOUT: case SL_STATUS_SI91X_FOUR_WAY_HANDSHAKE_FAILED: - return Status::kOtherConnectionFailure; + return NetworkCommissioningStatusEnum::kOtherConnectionFailure; default: - return Status::kUnknownError; + return NetworkCommissioningStatusEnum::kUnknownError; } } From 2048ddebc3ee729233336ad0d4229396cb71a400 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 20:55:07 +0530 Subject: [PATCH 26/67] Adds fix for #26861 --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index b4730e7d7ee..0ca7bc4e816 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -150,10 +150,9 @@ Status SlWiFiDriver::ReorderNetwork(ByteSpan networkId, uint8_t index, MutableCh CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen) { - // if the WiFi station is provisioned, disconnect it and clear the credentials + // if the WiFi station is provisioned, disconnect it if (ConnectivityMgr().IsWiFiStationProvisioned()) { - ConnectivityMgr().ClearWiFiStationProvision(); ChipLogProgress(DeviceLayer, "Disconnecting for current wifi"); WifiInterface::GetInstance().TriggerDisconnection(); } From b8a63c91d9fac0932ec6b02bebd47a94f80cd69c Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:14:31 +0530 Subject: [PATCH 27/67] Adds fix for #26861 --- .../silabs/NetworkCommissioningWiFiDriver.cpp | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 0ca7bc4e816..06935ee2ec5 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -180,58 +180,62 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, return CHIP_NO_ERROR; } -// TODO: Re-write implementation with proper driver based callback void SlWiFiDriver::UpdateNetworkingStatus() { VerifyOrReturn(mpStatusChangeCallback != nullptr); VerifyOrReturn(mStagingNetwork.ssidLen != 0); - ByteSpan networkId = ByteSpan((const unsigned char *) mStagingNetwork.ssid, mStagingNetwork.ssidLen); - if (!WifiInterface::GetInstance().IsStationConnected()) - { - // TODO: https://github.com/project-chip/connectedhomeip/issues/26861 - // TODO: use the mLastDisconnectionReason to set the networking status - mpStatusChangeCallback->OnNetworkingStatusChange(Status::kUnknownError, MakeOptional(networkId), - MakeOptional(static_cast(SL_STATUS_FAIL))); - return; - } - mpStatusChangeCallback->OnNetworkingStatusChange(Status::kSuccess, MakeOptional(networkId), NullOptional); + bool isStationConnected = WifiInterface::GetInstance().IsStationConnected(); + + Status commissioningError = isStationConnected ? Status::kSuccess : WifiInterface::GetInstance().GetLastDisconnectionReason(); + ByteSpan networkId = ByteSpan((const unsigned char *) mStagingNetwork.ssid, mStagingNetwork.ssidLen); + int32_t connectStatus = (isStationConnected ? SL_STATUS_OK : SL_STATUS_FAIL); + + ChipLogDetail(NetworkProvisioning, "UpdateNetworkingStatus: commissioningError: 0x%02X", + static_cast(commissioningError)); + + mpStatusChangeCallback->OnNetworkingStatusChange(commissioningError, MakeOptional(networkId), MakeOptional(connectStatus)); } void SlWiFiDriver::OnConnectWiFiNetwork() { - if (mpConnectCallback) - { - // TODO: use the mLastDisconnectionReason to set the networking status - mpConnectCallback->OnResult(Status::kSuccess, CharSpan(), 0); - mpConnectCallback = nullptr; - } + VerifyOrReturn(mpConnectCallback != nullptr); + + bool isStationConnected = WifiInterface::GetInstance().IsStationConnected(); + + Status commissioningError = isStationConnected ? Status::kSuccess : WifiInterface::GetInstance().GetLastDisconnectionReason(); + int32_t connectStatus = (isStationConnected ? SL_STATUS_OK : SL_STATUS_FAIL); + + ChipLogDetail(NetworkProvisioning, "OnConnectWiFiNetwork: commissioningError: 0x%02X", + static_cast(commissioningError)); + + mpConnectCallback->OnResult(commissioningError, // commissioning error + CharSpan(), // debug text + connectStatus // connect status + ); + mpConnectCallback = nullptr; } void SlWiFiDriver::ConnectNetwork(ByteSpan networkId, ConnectCallback * callback) { - CHIP_ERROR err = CHIP_NO_ERROR; - Status networkingStatus = Status::kUnknownError; + CHIP_ERROR err = CHIP_NO_ERROR; + Status commissioningError = Status::kSuccess; - VerifyOrExit(NetworkMatch(mStagingNetwork, networkId), networkingStatus = Status::kNetworkIDNotFound); - VerifyOrExit(mpConnectCallback == nullptr, networkingStatus = Status::kUnknownError); + VerifyOrExit(NetworkMatch(mStagingNetwork, networkId), commissioningError = Status::kNetworkIDNotFound); + VerifyOrExit(mpConnectCallback == nullptr, commissioningError = Status::kUnknownError); err = ConnectWiFiNetwork(reinterpret_cast(mStagingNetwork.ssid), mStagingNetwork.ssidLen, reinterpret_cast(mStagingNetwork.key), mStagingNetwork.keyLen); - if (err == CHIP_NO_ERROR) - { - mpConnectCallback = callback; - networkingStatus = Status::kSuccess; - } + VerifyOrExit(err == CHIP_NO_ERROR, commissioningError = Status::kUnknownError); + mpConnectCallback = callback; exit: - if (networkingStatus != Status::kSuccess) - { - ChipLogError(NetworkProvisioning, "Failed to connect to WiFi network: %" CHIP_ERROR_FORMAT, err.Format()); - mpConnectCallback = nullptr; - // TODO: use the mLastDisconnectionReason to set the networking status - callback->OnResult(networkingStatus, CharSpan(), 0); - } + VerifyOrReturn(commissioningError != Status::kSuccess); + ChipLogError(NetworkProvisioning, "Failed to connect to WiFi network: %" CHIP_ERROR_FORMAT, err.Format()); + callback->OnResult(commissioningError, // commissioning error + CharSpan(), // debug text + SL_STATUS_FAIL // connect status + ); } uint32_t SlWiFiDriver::GetSupportedWiFiBandsMask() const From c5385f88f64efd986c9ba04b6bc43b745873d5c5 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 15 Sep 2026 22:08:39 +0530 Subject: [PATCH 28/67] refactor(silabs-wifi): enable WiFi station mode during network connection setup --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 06935ee2ec5..1e9753d5876 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -169,9 +169,6 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, memcpy(wifiConfig.key, key, keyLen); wifiConfig.keyLen = keyLen; - // dummy value which is overridden by the actual security value when connecting to the access point - wifiConfig.security.Set(chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap::kWpa2Personal); - ChipLogProgress(NetworkProvisioning, "Setting up connection for WiFi SSID: %s", NullTerminated(ssid, ssidLen).c_str()); ReturnErrorOnFailure(WifiInterface::GetInstance().SetWifiCredentials(wifiConfig)); From 79682c9fb4033c4d23746885e75bef64c9363963 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 00:18:36 +0530 Subject: [PATCH 29/67] fix(silabs-wifi): return error from _Init method instead of CHIP_NO_ERROR --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index ababacb02eb..6607bf57973 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -73,7 +73,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); VerifyOrReturnError(err == CHIP_NO_ERROR, err); - return CHIP_NO_ERROR; + return err; } void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) From eb843fa39673517bfaa35ad6567e8e8e99b0eb1f Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 00:18:56 +0530 Subject: [PATCH 30/67] refactor(silabs-wifi): update log messages for WiFi events to improve clarity --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 6607bf57973..d02a8ad6d89 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -86,17 +86,17 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) switch (event->Platform.event.WFXSystemEvent.data.genericMsgEvent.header.id) { case to_underlying(WifiInterface::WifiEvent::kStartUp): - ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_STARTED"); + ChipLogProgress(DeviceLayer, "STARTUP EVENT"); DriveStationState(); break; case to_underlying(WifiInterface::WifiEvent::kConnect): - ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_CONNECTED"); + ChipLogProgress(DeviceLayer, "CONNECT EVENT"); ChangeWiFiStationState(kWiFiStationState_Connected); break; case to_underlying(WifiInterface::WifiEvent::kDisconnect): - ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_DISCONNECTED"); + ChipLogProgress(DeviceLayer, "DISCONNECT EVENT"); switch (WifiInterface::GetInstance().GetLastDisconnectionReason()) { // User initiated disconnection @@ -112,7 +112,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) case to_underlying(WifiInterface::WifiEvent::kGotIPv4): case to_underlying(WifiInterface::WifiEvent::kGotIPv6): case to_underlying(WifiInterface::WifiEvent::kLostIP): - ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_IP_CHANGE"); + ChipLogProgress(DeviceLayer, "IP CHANGE EVENT"); UpdateInternetConnectivityState(); break; default: From 4b9111223ccef389a02914d6d786533f0480a61f Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 00:27:10 +0530 Subject: [PATCH 31/67] refactor(silabs-wifi): enhance logging for application-controlled WiFi station mode --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index d02a8ad6d89..09a14442f09 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -184,7 +184,7 @@ void ConnectivityManagerImpl::_ClearWiFiStationProvision(void) { // If the WiFi station mode is application controlled, do not clear the WiFi credentials. VerifyOrReturn(mWiFiStationMode != kWiFiStationMode_ApplicationControlled, - ChipLogError(DeviceLayer, "kWiFiStationMode_ApplicationControlled enabled")); + ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); WifiInterface::GetInstance().ClearWifiCredentials(); TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); @@ -226,8 +226,8 @@ void ConnectivityManagerImpl::DriveStationState() // if the station mode is application controlled or disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_ApplicationControlled, - ChipLogError(DeviceLayer, "WiFi station mode is application controlled")); - VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogError(DeviceLayer, "WiFi station mode is disabled")); + ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); + VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); CHIP_ERROR err = CHIP_NO_ERROR; From ad12e09db7361eb0439e7e5e4ca7ba77e19c86aa Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 01:38:03 +0530 Subject: [PATCH 32/67] refactor(silabs-wifi): implement configuration commit and revert methods for WiFi driver --- .../silabs/NetworkCommissioningWiFiDriver.cpp | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 1e9753d5876..fd80195eb0a 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -45,10 +45,39 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC mpConnectCallback = nullptr; mpStatusChangeCallback = networkStatusChangeCallback; mDriver = this; + + err = RevertConfiguration(); + // If the configuration is not found, it means the wifi is not provisioned, no need to go further. + VerifyOrReturnError(err != CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND, CHIP_NO_ERROR); + err = ConnectWiFiNetwork(reinterpret_cast(mStagingNetwork.ssid), mStagingNetwork.ssidLen, + reinterpret_cast(mStagingNetwork.key), mStagingNetwork.keyLen); + return err; +} + +CHIP_ERROR SlWiFiDriver::CommitConfiguration() +{ + constexpr uint8_t kDefaultSecurityBitmap = + static_cast(chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap::kWpa2Personal); + + ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin( + SilabsConfig::kConfigKey_WiFiSSID, reinterpret_cast(mStagingNetwork.ssid), mStagingNetwork.ssidLen)); + ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin( + SilabsConfig::kConfigKey_WiFiPSK, reinterpret_cast(mStagingNetwork.key), mStagingNetwork.keyLen)); + // TODO: Remove commit of security bitmap, as security is automatically determined by the SSID and PSK during connection. + ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin(SilabsConfig::kConfigKey_WiFiSEC, &kDefaultSecurityBitmap, + sizeof(kDefaultSecurityBitmap))); + + mSavedNetwork = mStagingNetwork; + return CHIP_NO_ERROR; +} + +CHIP_ERROR SlWiFiDriver::RevertConfiguration() +{ + CHIP_ERROR err = CHIP_NO_ERROR; // If reading fails, wifi is not provisioned, no need to go further. err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiSSID, mSavedNetwork.ssid, sizeof(mSavedNetwork.ssid), mSavedNetwork.ssidLen); - if (err != CHIP_NO_ERROR) + if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) { #if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING memcpy(&mSavedNetwork.ssid, SL_WIFI_SSID, sizeof(SL_WIFI_SSID)); @@ -57,11 +86,11 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC err = CHIP_NO_ERROR; #endif // SL_ONNETWORK_PAIRING } - VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiPSK, mSavedNetwork.key, sizeof(mSavedNetwork.key), mSavedNetwork.keyLen); - if (err != CHIP_NO_ERROR) + if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) { #if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING memcpy(&mSavedNetwork.key, SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); @@ -70,35 +99,11 @@ CHIP_ERROR SlWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChangeC err = CHIP_NO_ERROR; #endif // SL_ONNETWORK_PAIRING } - VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_NO_ERROR); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); mStagingNetwork = mSavedNetwork; - err = ConnectWiFiNetwork(reinterpret_cast(mSavedNetwork.ssid), mSavedNetwork.ssidLen, - reinterpret_cast(mSavedNetwork.key), mSavedNetwork.keyLen); return err; } -CHIP_ERROR SlWiFiDriver::CommitConfiguration() -{ - constexpr uint8_t kDefaultSecurityBitmap = - static_cast(chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap::kWpa2Personal); - - ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin( - SilabsConfig::kConfigKey_WiFiSSID, reinterpret_cast(mStagingNetwork.ssid), mStagingNetwork.ssidLen)); - ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin( - SilabsConfig::kConfigKey_WiFiPSK, reinterpret_cast(mStagingNetwork.key), mStagingNetwork.keyLen)); - ReturnErrorOnFailure(SilabsConfig::WriteConfigValueBin(SilabsConfig::kConfigKey_WiFiSEC, &kDefaultSecurityBitmap, - sizeof(kDefaultSecurityBitmap))); - - mSavedNetwork = mStagingNetwork; - return CHIP_NO_ERROR; -} - -CHIP_ERROR SlWiFiDriver::RevertConfiguration() -{ - mStagingNetwork = mSavedNetwork; - return CHIP_NO_ERROR; -} - bool SlWiFiDriver::NetworkMatch(const Silabs::WifiInterface::WiFiCredentials & network, ByteSpan networkId) { return networkId.size() == network.ssidLen && memcmp(networkId.data(), network.ssid, network.ssidLen) == 0; From 7be8879bf2cddaf624a6fb67e11cec638ffd2feb Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 01:39:45 +0530 Subject: [PATCH 33/67] refactor(silabs-wifi): improve error handling and logging in WiFi network scanning --- .../silabs/NetworkCommissioningWiFiDriver.cpp | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index fd80195eb0a..2cfc8e07ee2 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -250,12 +250,8 @@ bool SlWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid) ChipLogDetail(DeviceLayer, "Start Scan WiFi Networks"); CHIP_ERROR err = WifiInterface::GetInstance().StartNetworkScan(ssid, OnScanWiFiNetworkDone); - if (err != CHIP_NO_ERROR) - { - ChipLogError(DeviceLayer, "StartNetworkScan failed: %" CHIP_ERROR_FORMAT, err.Format()); - return false; - } - + VerifyOrReturnValue(err == CHIP_NO_ERROR, false, + ChipLogError(DeviceLayer, "StartNetworkScan failed: %" CHIP_ERROR_FORMAT, err.Format())); return true; } @@ -265,26 +261,26 @@ void SlWiFiDriver::OnScanWiFiNetworkDone(NetworkCommissioning::WiFiScanResponse // Cannot use the driver if the instance is not initialized. VerifyOrDie(nwDriver != nullptr); // should never be null - if (!aScanResult) + // If the scan result is null, it means the scan completed. + if (aScanResult == nullptr) { ChipLogProgress(DeviceLayer, "OnScanWiFiNetworkDone: Receive all scanned networks information."); + VerifyOrReturn(nwDriver->mpScanCallback != nullptr); - if (nwDriver->mpScanCallback != nullptr) + if (mScanResponseIter.Count() == 0) { - if (mScanResponseIter.Count() == 0) - { - // if there is no network found, return kNetworkNotFound - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { - nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kNetworkNotFound, CharSpan(), nullptr); - nwDriver->mpScanCallback = nullptr; - }); - return; - } + // if there is no network found, return kNetworkNotFound TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { - nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kSuccess, CharSpan(), &mScanResponseIter); + nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kNetworkNotFound, CharSpan(), nullptr); nwDriver->mpScanCallback = nullptr; }); + return; } + + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { + nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kSuccess, CharSpan(), &mScanResponseIter); + nwDriver->mpScanCallback = nullptr; + }); } else { @@ -294,16 +290,14 @@ void SlWiFiDriver::OnScanWiFiNetworkDone(NetworkCommissioning::WiFiScanResponse void SlWiFiDriver::ScanNetworks(ByteSpan ssid, WiFiDriver::ScanCallback * callback) { - if (callback != nullptr) - { - mpScanCallback = callback; - if (!StartScanWiFiNetworks(ssid)) - { - ChipLogError(DeviceLayer, "ScanWiFiNetworks failed to start"); - mpScanCallback = nullptr; - callback->OnFinished(Status::kUnknownError, CharSpan(), nullptr); - } - } + VerifyOrReturn(callback != nullptr); + mpScanCallback = callback; + + // If the scan fails, return an error to the callback. + VerifyOrReturn(!StartScanWiFiNetworks(ssid)); + ChipLogError(DeviceLayer, "ScanWiFiNetworks failed to start"); + mpScanCallback = nullptr; + callback->OnFinished(Status::kUnknownError, CharSpan(), nullptr); } CHIP_ERROR GetConnectedNetwork(Network & network) From a5e473e2714ad4a773360b97288b790a35f7192a Mon Sep 17 00:00:00 2001 From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 11:17:19 +0530 Subject: [PATCH 34/67] Apply suggestion from @jmartinez-silabs Co-authored-by: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> --- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index f5627f6c239..8b6169842a6 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -36,7 +36,7 @@ #include // TODO: Remove nogncheck once we have a proper way to include this file. #include // nogncheck -#endif // SL_INET_CONFIG_UDP_LWIP_QUEUE_UNTIL_NETIF_READY +#endif // SL_INET_CONFIG_UDP_LWIP_QUEUE_UNTIL_NETIF_READY #include #include #include From 50183fe9cff304ef67a50bea5ff55a315bceae89 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 11:29:57 +0530 Subject: [PATCH 35/67] refactor(silabs-wifi): consolidate disconnection logic into a dedicated method for improved clarity and maintainability --- src/platform/silabs/ConnectivityManagerImpl.h | 1 + .../silabs/ConnectivityManagerImpl_WIFI.cpp | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 537e3a3cc49..76152b6dc51 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -104,6 +104,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, CHIP_ERROR _GetAndLogWifiStatsCounters(void); void _OnWiFiScanDone(); void _OnWiFiStationProvisionChange(); + CHIP_ERROR _DisconnectNetwork(void); #if CHIP_CONFIG_ENABLE_ICD_SERVER CHIP_ERROR _SetPollingInterval(System::Clock::Milliseconds32 pollingInterval); #endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */ diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 09a14442f09..9e912a355e5 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -153,9 +153,8 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF // disconnect if wifi is provisioned if (IsWiFiStationProvisioned()) { - WifiInterface::GetInstance().TriggerDisconnection(); - ChangeWiFiStationState(kWiFiStationState_Disconnecting); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() + err = DisconnectNetwork(); + VerifyOrReturnError(err == CHIP_NO_ERROR, err); } err = WifiInterface::GetInstance().DisableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_NOT_IMPLEMENTED, err); @@ -207,6 +206,15 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); } +CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) +{ + WifiInterface::GetInstance().TriggerDisconnection(); + ChangeWiFiStationState(kWiFiStationState_Disconnecting); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() + // next time DriveStationState() will be called, the station will be in the NotConnected state + return CHIP_NO_ERROR; +} + #if CHIP_CONFIG_ENABLE_ICD_SERVER CHIP_ERROR ConnectivityManagerImpl::_SetPollingInterval(System::Clock::Milliseconds32 pollingInterval) { @@ -244,10 +252,9 @@ void ConnectivityManagerImpl::DriveStationState() if (!IsWiFiStationProvisioned() && IsWiFiStationConnected()) { ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); - WifiInterface::GetInstance().TriggerDisconnection(); - ChangeWiFiStationState(kWiFiStationState_Disconnecting); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() - // next time DriveStationState() will be called, the station will be in the NotConnected state + err = DisconnectNetwork(); + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); return; } From c37c0ffefe5e1b17acdfbb12c3726b7e25e4a554 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:12:21 +0530 Subject: [PATCH 36/67] feat(silabs-wifi): implement auto-reconnect feature for WiFi station management --- src/platform/silabs/ConnectivityManagerImpl.h | 1 + .../silabs/ConnectivityManagerImpl_WIFI.cpp | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 76152b6dc51..4c3361fda07 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -121,6 +121,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, // variables for tracking the station mode and state WiFiStationMode mWiFiStationMode; WiFiStationState mWiFiStationState; + bool mWiFiStationAutoReconnect; // variables for tracking the last connection failure time and reconnect interval System::Clock::Timestamp mLastStationConnectFailTime; System::Clock::Timeout mWiFiStationReconnectInterval; diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 9e912a355e5..d1a64230c73 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -58,6 +58,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() CHIP_ERROR err; mWiFiStationMode = kWiFiStationMode_Disabled; mWiFiStationState = kWiFiStationState_NotConnected; + mWiFiStationAutoReconnect = true; mLastStationConnectFailTime = System::Clock::kZero; mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); mWiFiStationReconnectCount = 1; @@ -99,11 +100,14 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) ChipLogProgress(DeviceLayer, "DISCONNECT EVENT"); switch (WifiInterface::GetInstance().GetLastDisconnectionReason()) { - // User initiated disconnection + // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: + mWiFiStationAutoReconnect = false; ChangeWiFiStationState(kWiFiStationState_NotConnected); break; + // Disconnection due to WiFi connectivity error default: + mWiFiStationAutoReconnect = true; ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); break; } @@ -208,6 +212,7 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { + mWiFiStationAutoReconnect = false; WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() @@ -269,12 +274,15 @@ void ConnectivityManagerImpl::DriveStationState() switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { - // connect the station to the access point using the credentials from the staging network - err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network - VerifyOrReturn(err == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); - ChangeWiFiStationState(kWiFiStationState_Connecting); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() + if (mWiFiStationAutoReconnect) + { + // connect the station to the access point using the credentials from the staging network + err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); + mWiFiStationState = kWiFiStationState_Connecting; + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() + } } break; case kWiFiStationState_Connecting: { @@ -286,13 +294,6 @@ void ConnectivityManagerImpl::DriveStationState() // if the station is connecting failed, // arrange another connection attempt at a suitable point in the future mLastStationConnectFailTime = now; - - // TODO: Revisit this logic - // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of - // reconnect attempts thus saving power - // TODO: Guard this with commissioning mode flag - // mWiFiStationReconnectCount++; - // Reset the station state to NotConnected to start a new connection attempt mWiFiStationState = kWiFiStationState_NotConnected; timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval * mWiFiStationReconnectCount) - now; @@ -300,6 +301,12 @@ void ConnectivityManagerImpl::DriveStationState() ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); + + // TODO: Revisit this logic + // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of + // reconnect attempts thus saving power + // TODO: Guard this with commissioning mode flag + // mWiFiStationReconnectCount++; } break; default: { From 6623e2949658f33e9770e41286353e5dc985a3bf Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:19:28 +0530 Subject: [PATCH 37/67] feat(silabs-wifi): update WiFi station state management to reflect connection status --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index d1a64230c73..ab2edad56fb 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -267,6 +267,7 @@ void ConnectivityManagerImpl::DriveStationState() // connect it to the access point using the credentials from the staging // network VerifyOrReturn(IsWiFiStationProvisioned(), ChipLogDetail(DeviceLayer, "WiFi station is not provisioned")); + mWiFiStationState = IsWiFiStationConnected() ? kWiFiStationState_Connected : kWiFiStationState_NotConnected; System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); System::Clock::Timestamp timeToNextConnect = System::Clock::kZero; From 9c972148c6d2847ac73ed9e7d39ed9a362f27f6e Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:45:03 +0530 Subject: [PATCH 38/67] refactor(silabs-wifi): streamline WiFi network joining process and enhance connection state checks --- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 8b6169842a6..9b6296feab6 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -659,14 +659,9 @@ void WifiInterfaceImpl::NotifySuccessfulConnection(void) sl_status_t WifiInterfaceImpl::JoinWifiNetwork(void) { - VerifyOrReturnError( - !wfx_rsi.dev_state.HasAny(WifiInterface::WifiState::kStationConnecting, WifiInterface::WifiState::kStationConnected), - SL_STATUS_IN_PROGRESS); sl_status_t status = SL_STATUS_OK; // Start Join Network - wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnecting); - status = SetWifiConfigurations(); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "Failure to set the Wifi Configurations!")); @@ -902,10 +897,8 @@ CHIP_ERROR WifiInterfaceImpl::ConfigureLITConnect() VerifyOrReturnError(!IsStationConnected(), CHIP_NO_ERROR); - if (!wfx_rsi.dev_state.Has(WifiInterface::WifiState::kStationConnecting)) - { - return ConnectToAccessPoint(); - } + CHIP_ERROR err = ConnectToAccessPoint(); + VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, err); return CHIP_NO_ERROR; } @@ -1224,9 +1217,13 @@ CHIP_ERROR WifiInterfaceImpl::SetWifiCredentials(const WiFiCredentials & credent CHIP_ERROR WifiInterfaceImpl::ConnectToAccessPoint() { VerifyOrReturnError(IsWifiProvisioned(), CHIP_ERROR_INCORRECT_STATE); - + VerifyOrReturnError( + !wfx_rsi.dev_state.HasAny(WifiInterface::WifiState::kStationConnecting, WifiInterface::WifiState::kStationConnected), + CHIP_ERROR_IN_PROGRESS); + wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnecting); + ChipLogProgress(DeviceLayer, "connect to access point: %s", wfx_rsi.credentials.ssid); - + PostWifiPlatformEvent(WifiPlatformEvent::kStationStartScan); return CHIP_NO_ERROR; } From 592e0e7e4a8b0942916067e6b6a6d19a46973b55 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 17:14:16 +0530 Subject: [PATCH 39/67] feat(silabs-wifi): integrate WiFi driver setup into Matter shell initialization --- examples/platform/silabs/MatterConfig.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index e882310c2cb..bd8520eeaf6 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -48,6 +48,9 @@ #ifdef ENABLE_CHIP_SHELL #include "MatterShell.h" +#ifdef SL_WIFI +#include +#endif // SL_WIFI #endif #ifdef HEAP_MONITORING @@ -433,7 +436,12 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) #ifdef ENABLE_CHIP_SHELL chip::startShellTask(); -#endif + +#ifdef SL_WIFI + chip::Shell::SetWiFiDriver(chip::DeviceLayer::NetworkCommissioning::SlWiFiDriver::GetInstance()); +#endif // SL_WIFI + +#endif // ENABLE_CHIP_SHELL return CHIP_NO_ERROR; } From 432a3d23e5f1a159e76f42b4aa6dab647ed5b752 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 18:09:34 +0530 Subject: [PATCH 40/67] refactor(silabs-wifi): remove redundant event posting in connectivity reset function --- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 9b6296feab6..c2217a12bb4 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -1161,9 +1161,6 @@ void WifiInterfaceImpl::ResetConnectivityNotificationFlags(void) { ResetIPNotificationStates(); mHasNotifiedWifiConnectivity = false; - - WifiPlatformEvent event = WifiPlatformEvent::kConnectionComplete; - PostWifiPlatformEvent(event); } #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 From 80402e62d0be4fdcf80696a3d014dd4a9b4c0f9d Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:41:05 +0530 Subject: [PATCH 41/67] fix(silabs-wifi): reset reconnect count to prevent unintended connection attempts after user-initiated disconnection --- src/platform/silabs/ConnectivityManagerImpl.h | 2 +- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 35 ++++++++++++------- .../silabs/NetworkCommissioningWiFiDriver.cpp | 2 +- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 1 + 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 4c3361fda07..4702dda8196 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -132,7 +132,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void DriveStationState(void); void OnStationConnected(void); void OnStationDisconnected(void); - void ChangeWiFiStationState(WiFiStationState newState); + void ChangeWiFiStationState(WiFiStationState newState, bool driveState = true); static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState); void ResetReconnectionWiFiStationState(void); diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index ab2edad56fb..10571ae4ca5 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -154,27 +154,29 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF switch (mWiFiStationMode) { case kWiFiStationMode_Disabled: { - // disconnect if wifi is provisioned - if (IsWiFiStationProvisioned()) + // disconnect if wifi is connected + if (IsWiFiStationConnected()) { err = DisconnectNetwork(); VerifyOrReturnError(err == CHIP_NO_ERROR, err); } err = WifiInterface::GetInstance().DisableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_NOT_IMPLEMENTED, err); + mWiFiStationAutoReconnect = false; } break; case kWiFiStationMode_Enabled: { err = WifiInterface::GetInstance().EnableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR, err); + mWiFiStationAutoReconnect = true; } break; default: // kWiFiStationMode_Application break; } - err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - return err; + ChangeWiFiStationState(kWiFiStationState_NotConnected); + return CHIP_NO_ERROR; } CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationReconnectInterval(System::Clock::Timeout timeoutMs) @@ -213,6 +215,10 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { mWiFiStationAutoReconnect = false; + + // if the station is not connected, return success + VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); + WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() @@ -267,11 +273,12 @@ void ConnectivityManagerImpl::DriveStationState() // connect it to the access point using the credentials from the staging // network VerifyOrReturn(IsWiFiStationProvisioned(), ChipLogDetail(DeviceLayer, "WiFi station is not provisioned")); - mWiFiStationState = IsWiFiStationConnected() ? kWiFiStationState_Connected : kWiFiStationState_NotConnected; + // TODO: Verify why `now` is always the same value System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); System::Clock::Timestamp timeToNextConnect = System::Clock::kZero; + ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { @@ -279,9 +286,9 @@ void ConnectivityManagerImpl::DriveStationState() { // connect the station to the access point using the credentials from the staging network err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network - VerifyOrReturn(err == CHIP_NO_ERROR, + VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); - mWiFiStationState = kWiFiStationState_Connecting; + ChangeWiFiStationState(kWiFiStationState_Connecting, false); // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() } } @@ -294,10 +301,11 @@ void ConnectivityManagerImpl::DriveStationState() case kWiFiStationState_Connecting_Failed: { // if the station is connecting failed, // arrange another connection attempt at a suitable point in the future + // TODO: Verify why `mLastStationConnectFailTime` is not assigned the value of `now` mLastStationConnectFailTime = now; // Reset the station state to NotConnected to start a new connection attempt - mWiFiStationState = kWiFiStationState_NotConnected; - timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval * mWiFiStationReconnectCount) - now; + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); + timeToNextConnect = (mWiFiStationReconnectInterval * mWiFiStationReconnectCount); // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); @@ -311,7 +319,7 @@ void ConnectivityManagerImpl::DriveStationState() } break; default: { - ChipLogDetail(DeviceLayer, "drive station state not handled: %s", WiFiStationStateToStr(mWiFiStationState)); + // do nothing } break; } @@ -356,7 +364,7 @@ void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, sInstance.DriveStationState(); } -void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) +void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, bool driveState) { VerifyOrReturn(mWiFiStationState != newState); ChipLogProgress(DeviceLayer, "WiFi station state change: %s -> %s", WiFiStationStateToStr(mWiFiStationState), @@ -388,7 +396,10 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) ChipLogDetail(DeviceLayer, "WiFi station state not driving: %s", WiFiStationStateToStr(newState)); break; } - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + if (driveState) + { + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + } // TODO: Remove this once the WiFi driver is updated to use the new state machine NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 2cfc8e07ee2..0c005e33df5 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -159,7 +159,7 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, if (ConnectivityMgr().IsWiFiStationProvisioned()) { ChipLogProgress(DeviceLayer, "Disconnecting for current wifi"); - WifiInterface::GetInstance().TriggerDisconnection(); + ReturnErrorOnFailure(ConnectivityMgr().DisconnectNetwork()); } ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled)); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index c2217a12bb4..401c0c67982 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -597,6 +597,7 @@ void WifiInterfaceImpl::ProcessEvent(WifiPlatformEvent event) wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnected); wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnecting); ResetConnectivityNotificationFlags(); + NotifySuccessfulConnection(); break; case WifiPlatformEvent::kStationDisconnect: { From d1b177a3495368acbacbbac44a828de41e0f9b79 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 16 Sep 2026 22:01:42 +0530 Subject: [PATCH 42/67] refactor(silabs-wifi): enhance WiFi station state management by removing auto-reconnect logic and improving state transition handling --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 10571ae4ca5..c7a9d2fd7fc 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -88,7 +88,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { case to_underlying(WifiInterface::WifiEvent::kStartUp): ChipLogProgress(DeviceLayer, "STARTUP EVENT"); - DriveStationState(); + ChangeWiFiStationState(kWiFiStationState_NotConnected); break; case to_underlying(WifiInterface::WifiEvent::kConnect): @@ -102,12 +102,10 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: - mWiFiStationAutoReconnect = false; ChangeWiFiStationState(kWiFiStationState_NotConnected); break; // Disconnection due to WiFi connectivity error default: - mWiFiStationAutoReconnect = true; ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); break; } @@ -214,8 +212,6 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { - mWiFiStationAutoReconnect = false; - // if the station is not connected, return success VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); @@ -304,11 +300,11 @@ void ConnectivityManagerImpl::DriveStationState() // TODO: Verify why `mLastStationConnectFailTime` is not assigned the value of `now` mLastStationConnectFailTime = now; // Reset the station state to NotConnected to start a new connection attempt - ChangeWiFiStationState(kWiFiStationState_NotConnected, false); timeToNextConnect = (mWiFiStationReconnectInterval * mWiFiStationReconnectCount); // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); // TODO: Revisit this logic @@ -371,7 +367,8 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. - mWiFiStationState = newState; + WiFiStationState prevState = mWiFiStationState; + mWiFiStationState = newState; switch (newState) { case kWiFiStationState_Connecting_Succeeded: @@ -384,7 +381,12 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, break; case kWiFiStationState_NotConnected: - ResetReconnectionWiFiStationState(); + mWiFiStationAutoReconnect = true; + if (prevState == kWiFiStationState_Disconnecting) + { + mWiFiStationAutoReconnect = false; + ResetReconnectionWiFiStationState(); + } OnStationDisconnected(); break; @@ -393,7 +395,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, break; default: - ChipLogDetail(DeviceLayer, "WiFi station state not driving: %s", WiFiStationStateToStr(newState)); + // do nothing break; } if (driveState) From 6f11512ce06434864bfbd28aa4cc08503b3a2c93 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 00:52:37 +0530 Subject: [PATCH 43/67] refactor(silabs-wifi): rename auto-reconnect variable to auto-connect and streamline WiFi station state management --- src/platform/silabs/ConnectivityManagerImpl.h | 4 +- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 112 +++++++++--------- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 4 +- 3 files changed, 57 insertions(+), 63 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 4702dda8196..6e0559722c7 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -121,7 +121,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, // variables for tracking the station mode and state WiFiStationMode mWiFiStationMode; WiFiStationState mWiFiStationState; - bool mWiFiStationAutoReconnect; + bool mWiFiStationAutoConnect; // variables for tracking the last connection failure time and reconnect interval System::Clock::Timestamp mLastStationConnectFailTime; System::Clock::Timeout mWiFiStationReconnectInterval; @@ -132,7 +132,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void DriveStationState(void); void OnStationConnected(void); void OnStationDisconnected(void); - void ChangeWiFiStationState(WiFiStationState newState, bool driveState = true); + void ChangeWiFiStationState(WiFiStationState newState); static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState); void ResetReconnectionWiFiStationState(void); diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index c7a9d2fd7fc..6802a647c20 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -58,22 +58,20 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() CHIP_ERROR err; mWiFiStationMode = kWiFiStationMode_Disabled; mWiFiStationState = kWiFiStationState_NotConnected; - mWiFiStationAutoReconnect = true; + mWiFiStationAutoConnect = true; mLastStationConnectFailTime = System::Clock::kZero; mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); mWiFiStationReconnectCount = 1; mFlags.ClearAll(); // TODO Initialize the Chip Addressing and Routing Module. - + // Ensure that station mode is enabled. err = SetWiFiStationMode(kWiFiStationMode_Enabled); VerifyOrReturnError(err == CHIP_NO_ERROR, err); // Queue work items to bootstrap the AP and station state machines once the Chip event loop is running. err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - VerifyOrReturnError(err == CHIP_NO_ERROR, err); - return err; } @@ -88,7 +86,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { case to_underlying(WifiInterface::WifiEvent::kStartUp): ChipLogProgress(DeviceLayer, "STARTUP EVENT"); - ChangeWiFiStationState(kWiFiStationState_NotConnected); + DriveStationState(); break; case to_underlying(WifiInterface::WifiEvent::kConnect): @@ -142,10 +140,10 @@ bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void) CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val) { // If the new WiFi station mode is the same as the current WiFi station mode, return success. - VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR); + VerifyOrReturnError(val != mWiFiStationMode, CHIP_NO_ERROR, + ChipLogDetail(DeviceLayer, "SetWiFiStationMode ignored: %s", WiFiStationModeToStr(val))); - ChipLogProgress(DeviceLayer, "WiFi station mode change: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), - WiFiStationModeToStr(val)); + ChipLogProgress(DeviceLayer, "WiFiStationMode: %s -> %s", WiFiStationModeToStr(mWiFiStationMode), WiFiStationModeToStr(val)); mWiFiStationMode = val; CHIP_ERROR err = CHIP_NO_ERROR; @@ -160,20 +158,23 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF } err = WifiInterface::GetInstance().DisableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_NOT_IMPLEMENTED, err); - mWiFiStationAutoReconnect = false; } break; case kWiFiStationMode_Enabled: { err = WifiInterface::GetInstance().EnableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR, err); - mWiFiStationAutoReconnect = true; } break; default: // kWiFiStationMode_Application break; } - ChangeWiFiStationState(kWiFiStationState_NotConnected); + mWiFiStationState = kWiFiStationState_NotConnected; + + // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received + VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + return CHIP_NO_ERROR; } @@ -238,22 +239,17 @@ void ConnectivityManagerImpl::DriveStationState() { // Refresh the current state and store it in `mWiFiStationMode` WiFiStationMode stationMode = GetWiFiStationMode(); - + CHIP_ERROR err = CHIP_NO_ERROR; // if the station mode is application controlled or disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_ApplicationControlled, ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); - VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); - - CHIP_ERROR err = CHIP_NO_ERROR; - // If the station interface is NOT under application control... // Ensure that the WiFi task is started. // returns CHIP_NO_ERROR if the task is started successfully, also when the task is already started err = WifiInterface::GetInstance().StartWifiTask(); VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "StartWifiTask failed: %" CHIP_ERROR_FORMAT, err.Format())); - - err = SetWiFiStationMode(kWiFiStationMode_Enabled); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "SetStationMode failed: %" CHIP_ERROR_FORMAT, err.Format())); + // if the station mode is disabled, return + VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); // if the station is not provisioned but connected, disconnect it if (!IsWiFiStationProvisioned() && IsWiFiStationConnected()) @@ -265,10 +261,12 @@ void ConnectivityManagerImpl::DriveStationState() return; } - // if the station is provisioned and not connected, - // connect it to the access point using the credentials from the staging - // network - VerifyOrReturn(IsWiFiStationProvisioned(), ChipLogDetail(DeviceLayer, "WiFi station is not provisioned")); + // if the station is provisioned and auto connect is enabled and the station is not connected, + // connect it to the access point using the credentials from the staging network + if (IsWiFiStationProvisioned() && mWiFiStationAutoConnect && (mWiFiStationState == kWiFiStationState_NotConnected)) + { + mWiFiStationState = kWiFiStationState_Connecting; + } // TODO: Verify why `now` is always the same value System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); @@ -278,19 +276,14 @@ void ConnectivityManagerImpl::DriveStationState() switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { - if (mWiFiStationAutoReconnect) - { - // connect the station to the access point using the credentials from the staging network - err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network - VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, - ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); - ChangeWiFiStationState(kWiFiStationState_Connecting, false); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() - } + break; } - break; case kWiFiStationState_Connecting: { - // Connection attempt already in progress; wait for connect/disconnect platform events. + // connect the station to the access point using the credentials from the staging network + err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network + VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, + ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() return; } break; @@ -299,12 +292,12 @@ void ConnectivityManagerImpl::DriveStationState() // arrange another connection attempt at a suitable point in the future // TODO: Verify why `mLastStationConnectFailTime` is not assigned the value of `now` mLastStationConnectFailTime = now; - // Reset the station state to NotConnected to start a new connection attempt + // Reset the station state to kWiFiStationState_Connecting to start a new connection attempt timeToNextConnect = (mWiFiStationReconnectInterval * mWiFiStationReconnectCount); // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); - ChangeWiFiStationState(kWiFiStationState_NotConnected, false); + mWiFiStationState = kWiFiStationState_Connecting; ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); // TODO: Revisit this logic @@ -315,7 +308,9 @@ void ConnectivityManagerImpl::DriveStationState() } break; default: { - // do nothing + // kWiFiStationState_NotConnected + // kWiFiStationState_Connected + // kWiFiStationState_Connecting_Succeeded } break; } @@ -360,48 +355,47 @@ void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, sInstance.DriveStationState(); } -void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, bool driveState) +void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) { - VerifyOrReturn(mWiFiStationState != newState); - ChipLogProgress(DeviceLayer, "WiFi station state change: %s -> %s", WiFiStationStateToStr(mWiFiStationState), + VerifyOrReturn(mWiFiStationState != newState, + ChipLogDetail(DeviceLayer, "ChangeWiFiStationState ignored: %s", WiFiStationStateToStr(newState))); + ChipLogProgress(DeviceLayer, "WiFiStationState: %s -> %s", WiFiStationStateToStr(mWiFiStationState), WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. - WiFiStationState prevState = mWiFiStationState; - mWiFiStationState = newState; + mWiFiStationState = newState; switch (newState) { + case kWiFiStationState_NotConnected: + mWiFiStationAutoConnect = true; + ResetReconnectionWiFiStationState(); + OnStationDisconnected(); + break; + + case kWiFiStationState_Connecting_Failed: + OnStationDisconnected(); + break; + case kWiFiStationState_Connecting_Succeeded: ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Connected: - OnStationConnected(); // alert other components of the new state - break; - - case kWiFiStationState_NotConnected: - mWiFiStationAutoReconnect = true; - if (prevState == kWiFiStationState_Disconnecting) - { - mWiFiStationAutoReconnect = false; - ResetReconnectionWiFiStationState(); - } - OnStationDisconnected(); + ResetReconnectionWiFiStationState(); + OnStationConnected(); break; - case kWiFiStationState_Connecting_Failed: - OnStationDisconnected(); // alert other components of the new state + case kWiFiStationState_Disconnecting: + mWiFiStationAutoConnect = false; break; default: // do nothing break; } - if (driveState) - { - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - } + + DriveStationState(); // TODO: Remove this once the WiFi driver is updated to use the new state machine NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 401c0c67982..21242070173 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -1219,9 +1219,9 @@ CHIP_ERROR WifiInterfaceImpl::ConnectToAccessPoint() !wfx_rsi.dev_state.HasAny(WifiInterface::WifiState::kStationConnecting, WifiInterface::WifiState::kStationConnected), CHIP_ERROR_IN_PROGRESS); wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnecting); - + ChipLogProgress(DeviceLayer, "connect to access point: %s", wfx_rsi.credentials.ssid); - + PostWifiPlatformEvent(WifiPlatformEvent::kStationStartScan); return CHIP_NO_ERROR; } From 243dcbac58f37fa51b90884bf546bf2928f3b241 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 01:44:12 +0530 Subject: [PATCH 44/67] refactor(silabs-wifi): improve WiFi station state handling and logging for better clarity and maintainability --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 6802a647c20..7bceb708b89 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -65,7 +65,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() mFlags.ClearAll(); // TODO Initialize the Chip Addressing and Routing Module. - + // Ensure that station mode is enabled. err = SetWiFiStationMode(kWiFiStationMode_Enabled); VerifyOrReturnError(err == CHIP_NO_ERROR, err); @@ -172,7 +172,8 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF mWiFiStationState = kWiFiStationState_NotConnected; // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received - VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); + VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, + ChipLogDetail(DeviceLayer, "WiFi station is not ready")); TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); return CHIP_NO_ERROR; @@ -239,7 +240,7 @@ void ConnectivityManagerImpl::DriveStationState() { // Refresh the current state and store it in `mWiFiStationMode` WiFiStationMode stationMode = GetWiFiStationMode(); - CHIP_ERROR err = CHIP_NO_ERROR; + CHIP_ERROR err = CHIP_NO_ERROR; // if the station mode is application controlled or disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_ApplicationControlled, ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); @@ -276,15 +277,33 @@ void ConnectivityManagerImpl::DriveStationState() switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { + ChipLogDetail(DeviceLayer, "mWiFiStationAutoConnect: %d", mWiFiStationAutoConnect); + ChipLogDetail(DeviceLayer, "IsWiFiStationProvisioned: %d", IsWiFiStationProvisioned()); + ChipLogDetail(DeviceLayer, "IsWiFiStationConnected: %d", IsWiFiStationConnected()); + mWiFiStationAutoConnect = true; + ResetReconnectionWiFiStationState(); break; } + case kWiFiStationState_Connected: { + mWiFiStationAutoConnect = true; + ResetReconnectionWiFiStationState(); + } + break; + case kWiFiStationState_Connecting_Succeeded: { + mWiFiStationAutoConnect = true; + ResetReconnectionWiFiStationState(); + } + break; case kWiFiStationState_Connecting: { - // connect the station to the access point using the credentials from the staging network - err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network - VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, - ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() - return; + if (mWiFiStationAutoConnect) + { + // connect the station to the access point using the credentials from the staging network + err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network + VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, + ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() + return; + } } break; case kWiFiStationState_Connecting_Failed: { @@ -307,10 +326,16 @@ void ConnectivityManagerImpl::DriveStationState() // mWiFiStationReconnectCount++; } break; + case kWiFiStationState_Disconnecting: { + mWiFiStationAutoConnect = false; + if (!IsWiFiStationConnected()) + { + mWiFiStationState = kWiFiStationState_NotConnected; + } + } + break; default: { - // kWiFiStationState_NotConnected - // kWiFiStationState_Connected - // kWiFiStationState_Connecting_Succeeded + // do nothing } break; } @@ -367,8 +392,8 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) switch (newState) { case kWiFiStationState_NotConnected: - mWiFiStationAutoConnect = true; - ResetReconnectionWiFiStationState(); + // mWiFiStationAutoConnect = true; + // ResetReconnectionWiFiStationState(); OnStationDisconnected(); break; @@ -377,17 +402,17 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) break; case kWiFiStationState_Connecting_Succeeded: - ResetReconnectionWiFiStationState(); + // ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Connected: - ResetReconnectionWiFiStationState(); + // ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Disconnecting: - mWiFiStationAutoConnect = false; + // mWiFiStationAutoConnect = false; break; default: From 6bfef306982a8c8325135fa4366c0f7bb6c18ee5 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:17:53 +0530 Subject: [PATCH 45/67] refactor(silabs-wifi): enhance network validation checks and improve documentation for disconnection reason --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 6 +++--- src/platform/silabs/wifi/WifiInterface.h | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 0c005e33df5..5297321d2e9 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -115,11 +115,11 @@ Status SlWiFiDriver::AddOrUpdateNetwork(ByteSpan ssid, ByteSpan credentials, Mut outDebugText.reduce_size(0); // since we only support one network, we always return 0 outNetworkIndex = 0; + // using ssid as the networkId - VerifyOrReturnError(mStagingNetwork.ssidLen == 0 || NetworkMatch(mStagingNetwork, ssid), Status::kBoundsExceeded); - VerifyOrReturnError(credentials.size() <= sizeof(mStagingNetwork.key), Status::kOutOfRange); VerifyOrReturnError(ssid.size() <= sizeof(mStagingNetwork.ssid), Status::kOutOfRange); - + VerifyOrReturnError(credentials.size() <= sizeof(mStagingNetwork.key), Status::kOutOfRange); + VerifyOrReturnError(ssid.data() != nullptr, Status::kNetworkIDNotFound); MutableByteSpan ssidSpan(mStagingNetwork.ssid, sizeof(mStagingNetwork.ssid)); VerifyOrReturnError(CopySpanToMutableSpan(ssid, ssidSpan) == CHIP_NO_ERROR, Status::kBoundsExceeded); diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index e5c303b7f98..c6614ed8dc9 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -338,7 +338,8 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface /** * @brief Function returns the last disconnection reason by mapping platform error codes * to the NetworkCommissioningStatusEnum value - * @return NetworkCommissioningStatusEnum value for the last disconnection reason + * @return NetworkCommissioningStatusEnum value for the last disconnection reason, + * kSuccess if the disconnection was user initiated otherwise the reason for the disconnection */ chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatusEnum GetLastDisconnectionReason(); From e5de36ffd7d8dfdc51507990491045079ea7af42 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 18:35:30 +0530 Subject: [PATCH 46/67] refactor(silabs-wifi): improve WiFi station state management and enhance connection handling logic --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 78 ++++++++++--------- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 5 +- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 7bceb708b89..9fc027ef04d 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -100,10 +100,13 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: - ChangeWiFiStationState(kWiFiStationState_NotConnected); + DriveStationState(); + // ChangeWiFiStationState(kWiFiStationState_NotConnected); break; // Disconnection due to WiFi connectivity error default: + VerifyOrReturn(mWiFiStationState != kWiFiStationState_NotConnected, + ChipLogDetail(DeviceLayer, "Discard disconnect event as WiFi station is not connected")); ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); break; } @@ -169,8 +172,7 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF // kWiFiStationMode_Application break; } - mWiFiStationState = kWiFiStationState_NotConnected; - + mWiFiStationAutoConnect = true; // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); @@ -241,6 +243,9 @@ void ConnectivityManagerImpl::DriveStationState() // Refresh the current state and store it in `mWiFiStationMode` WiFiStationMode stationMode = GetWiFiStationMode(); CHIP_ERROR err = CHIP_NO_ERROR; + bool isStationConnected = WifiInterface::GetInstance().IsStationConnected(); + bool isStationProvisioned = WifiInterface::GetInstance().IsWifiProvisioned(); + // if the station mode is application controlled or disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_ApplicationControlled, ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); @@ -253,7 +258,7 @@ void ConnectivityManagerImpl::DriveStationState() VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); // if the station is not provisioned but connected, disconnect it - if (!IsWiFiStationProvisioned() && IsWiFiStationConnected()) + if (!isStationProvisioned && isStationConnected) { ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); err = DisconnectNetwork(); @@ -264,9 +269,13 @@ void ConnectivityManagerImpl::DriveStationState() // if the station is provisioned and auto connect is enabled and the station is not connected, // connect it to the access point using the credentials from the staging network - if (IsWiFiStationProvisioned() && mWiFiStationAutoConnect && (mWiFiStationState == kWiFiStationState_NotConnected)) + if (isStationProvisioned && mWiFiStationAutoConnect && !isStationConnected) { - mWiFiStationState = kWiFiStationState_Connecting; + // if the station is not connected, set the state to connecting + if (mWiFiStationState == kWiFiStationState_NotConnected) + { + mWiFiStationState = kWiFiStationState_Connecting; + } } // TODO: Verify why `now` is always the same value @@ -277,33 +286,21 @@ void ConnectivityManagerImpl::DriveStationState() switch (mWiFiStationState) { case kWiFiStationState_NotConnected: { - ChipLogDetail(DeviceLayer, "mWiFiStationAutoConnect: %d", mWiFiStationAutoConnect); - ChipLogDetail(DeviceLayer, "IsWiFiStationProvisioned: %d", IsWiFiStationProvisioned()); - ChipLogDetail(DeviceLayer, "IsWiFiStationConnected: %d", IsWiFiStationConnected()); - mWiFiStationAutoConnect = true; - ResetReconnectionWiFiStationState(); - break; } + break; case kWiFiStationState_Connected: { - mWiFiStationAutoConnect = true; - ResetReconnectionWiFiStationState(); } break; case kWiFiStationState_Connecting_Succeeded: { - mWiFiStationAutoConnect = true; - ResetReconnectionWiFiStationState(); } break; case kWiFiStationState_Connecting: { - if (mWiFiStationAutoConnect) - { - // connect the station to the access point using the credentials from the staging network - err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network - VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, - ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() - return; - } + // connect the station to the access point using the credentials from the staging network + err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network + VerifyOrReturn(err == CHIP_NO_ERROR || err == CHIP_ERROR_IN_PROGRESS, + ChipLogError(DeviceLayer, "ConnectToAccessPoint failed: %" CHIP_ERROR_FORMAT, err.Format())); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of ConnectWiFiNetwork() + return; } break; case kWiFiStationState_Connecting_Failed: { @@ -327,10 +324,10 @@ void ConnectivityManagerImpl::DriveStationState() } break; case kWiFiStationState_Disconnecting: { - mWiFiStationAutoConnect = false; - if (!IsWiFiStationConnected()) + if (!isStationConnected) { mWiFiStationState = kWiFiStationState_NotConnected; + TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); } } break; @@ -373,6 +370,7 @@ void ConnectivityManagerImpl::ResetReconnectionWiFiStationState() { mLastStationConnectFailTime = System::Clock::kZero; mWiFiStationReconnectCount = 1; + DeviceLayer::SystemLayer().CancelTimer(DriveStationState, NULL); } void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, void * aAppState) @@ -388,12 +386,12 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. - mWiFiStationState = newState; + WiFiStationState prevState = mWiFiStationState; + mWiFiStationState = newState; switch (newState) { case kWiFiStationState_NotConnected: - // mWiFiStationAutoConnect = true; - // ResetReconnectionWiFiStationState(); + ResetReconnectionWiFiStationState(); OnStationDisconnected(); break; @@ -402,17 +400,23 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) break; case kWiFiStationState_Connecting_Succeeded: - // ResetReconnectionWiFiStationState(); - OnStationConnected(); - break; - case kWiFiStationState_Connected: - // ResetReconnectionWiFiStationState(); + if (prevState != kWiFiStationState_Connecting) + { + // illegal state transition + // disconnect the station to avoid further attempts to connect + // done to align out of bound disconnection during connection attempt + DisconnectNetwork(); + return; + } + + ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Disconnecting: - // mWiFiStationAutoConnect = false; + ResetReconnectionWiFiStationState(); + mWiFiStationAutoConnect = false; break; default: @@ -438,7 +442,7 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) IPAddress addr; // If the WiFi station is currently in the connected state... - if (mWiFiStationState == kWiFiStationState_Connected) + if (IsWiFiStationConnected()) { #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 haveIPv4Conn = WifiInterface::GetInstance().HasAnIPv4Address(); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 21242070173..26f217bc474 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -846,9 +846,6 @@ sl_status_t WifiInterfaceImpl::TriggerPlatformWifiDisconnection() { sl_status_t status = sl_net_down(SL_NET_WIFI_CLIENT_INTERFACE); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_down failed: 0x%lx", status)); - - mLastDisconnectionReason = status; - WifiInterface::NotifyDisconnection(status); return SL_STATUS_OK; } @@ -863,6 +860,8 @@ void WifiInterfaceImpl::ClearWifiDisconnectedState() NotifyIPv4Change(false); #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ NotifyIPv6Change(false); + mLastDisconnectionReason = SL_STATUS_OK; + WifiInterface::NotifyDisconnection(mLastDisconnectionReason); } #if CHIP_CONFIG_ENABLE_ICD_SERVER From 9bd64d16c4161868e40076b4023be4c974a77377 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Thu, 17 Sep 2026 13:06:09 +0000 Subject: [PATCH 47/67] Restyled by whitespace --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 2 +- src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 5297321d2e9..b4f29218401 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -119,7 +119,7 @@ Status SlWiFiDriver::AddOrUpdateNetwork(ByteSpan ssid, ByteSpan credentials, Mut // using ssid as the networkId VerifyOrReturnError(ssid.size() <= sizeof(mStagingNetwork.ssid), Status::kOutOfRange); VerifyOrReturnError(credentials.size() <= sizeof(mStagingNetwork.key), Status::kOutOfRange); - + VerifyOrReturnError(ssid.data() != nullptr, Status::kNetworkIDNotFound); MutableByteSpan ssidSpan(mStagingNetwork.ssid, sizeof(mStagingNetwork.ssid)); VerifyOrReturnError(CopySpanToMutableSpan(ssid, ssidSpan) == CHIP_NO_ERROR, Status::kBoundsExceeded); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 26f217bc474..5052eaf310d 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -846,6 +846,7 @@ sl_status_t WifiInterfaceImpl::TriggerPlatformWifiDisconnection() { sl_status_t status = sl_net_down(SL_NET_WIFI_CLIENT_INTERFACE); VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_down failed: 0x%lx", status)); + return SL_STATUS_OK; } From 51339176aa4f3f472103c8dc1ff8b62d164ab66d Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 19:04:32 +0530 Subject: [PATCH 48/67] refactor(silabs-wifi): enhance logging during station state transitions and improve disconnection handling --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 9fc027ef04d..b920daa01a8 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -406,7 +406,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) // illegal state transition // disconnect the station to avoid further attempts to connect // done to align out of bound disconnection during connection attempt - DisconnectNetwork(); + SuccessOrLog(DisconnectNetwork(), DeviceLayer); return; } From fde5f578d7dca39154188fadedbc8c7ba65ad0e3 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 19:33:37 +0530 Subject: [PATCH 49/67] refactor(silabs-wifi): add detailed logging for disconnection events and improve error handling during network disconnection --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index b920daa01a8..9881bd502cd 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -406,7 +406,8 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) // illegal state transition // disconnect the station to avoid further attempts to connect // done to align out of bound disconnection during connection attempt - SuccessOrLog(DisconnectNetwork(), DeviceLayer); + VerifyOrReturn(DisconnectNetwork() == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); return; } From 2edafaf07fb75a059b3221e48a2a27111a8dfe5e Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Thu, 17 Sep 2026 23:58:42 +0530 Subject: [PATCH 50/67] refactor(silabs-wifi): add detailed logging for state transitions and streamline disconnection error handling --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 9881bd502cd..3714f999e35 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -406,8 +406,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) // illegal state transition // disconnect the station to avoid further attempts to connect // done to align out of bound disconnection during connection attempt - VerifyOrReturn(DisconnectNetwork() == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); + VerifyOrReturn(DisconnectNetwork() == CHIP_NO_ERROR); return; } From c52d854add4cacdfeee33abc8929bf5e1c9435fe Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:10:57 +0530 Subject: [PATCH 51/67] refactor(silabs-wifi): update ChangeWiFiStationState to accept driveStationState parameter for improved state management --- src/platform/silabs/ConnectivityManagerImpl.h | 2 +- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 6e0559722c7..e98307ab372 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -132,7 +132,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void DriveStationState(void); void OnStationConnected(void); void OnStationDisconnected(void); - void ChangeWiFiStationState(WiFiStationState newState); + void ChangeWiFiStationState(WiFiStationState newState, bool driveStationState = true); static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState); void ResetReconnectionWiFiStationState(void); diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 3714f999e35..be2993995d0 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -274,7 +274,7 @@ void ConnectivityManagerImpl::DriveStationState() // if the station is not connected, set the state to connecting if (mWiFiStationState == kWiFiStationState_NotConnected) { - mWiFiStationState = kWiFiStationState_Connecting; + ChangeWiFiStationState(kWiFiStationState_Connecting, false); } } @@ -313,7 +313,7 @@ void ConnectivityManagerImpl::DriveStationState() // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); - mWiFiStationState = kWiFiStationState_Connecting; + ChangeWiFiStationState(kWiFiStationState_Connecting, false); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); // TODO: Revisit this logic @@ -326,7 +326,7 @@ void ConnectivityManagerImpl::DriveStationState() case kWiFiStationState_Disconnecting: { if (!isStationConnected) { - mWiFiStationState = kWiFiStationState_NotConnected; + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); } } @@ -378,7 +378,7 @@ void ConnectivityManagerImpl::DriveStationState(::chip::System::Layer * aLayer, sInstance.DriveStationState(); } -void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) +void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, bool driveStationState) { VerifyOrReturn(mWiFiStationState != newState, ChipLogDetail(DeviceLayer, "ChangeWiFiStationState ignored: %s", WiFiStationStateToStr(newState))); @@ -424,7 +424,10 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState) break; } - DriveStationState(); + if (driveStationState) + { + DriveStationState(); + } // TODO: Remove this once the WiFi driver is updated to use the new state machine NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); From 3be7486eb0f73b64e5589c857970bce0360b950c Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:57:32 +0530 Subject: [PATCH 52/67] refactor(silabs-wifi): improve station connection logic and streamline state transitions for better handling of provisioning and connection states --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index be2993995d0..04cf63ee10f 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -257,19 +257,35 @@ void ConnectivityManagerImpl::DriveStationState() // if the station mode is disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); - // if the station is not provisioned but connected, disconnect it - if (!isStationProvisioned && isStationConnected) + if (isStationConnected) { - ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); - err = DisconnectNetwork(); - VerifyOrReturn(err == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); - return; + // sync the station state with the actual state + switch (mWiFiStationState) + { + case kWiFiStationState_NotConnected: + case kWiFiStationState_Connecting_Succeeded: + ChangeWiFiStationState(kWiFiStationState_Connected, false); + break; + default: + break; + } + + // if the station is not provisioned, disconnect it + if (!isStationProvisioned) + { + ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); + err = DisconnectNetwork(); + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); + } } + // if the station is not connected + VerifyOrReturn(!isStationConnected); + // if the station is provisioned and auto connect is enabled and the station is not connected, // connect it to the access point using the credentials from the staging network - if (isStationProvisioned && mWiFiStationAutoConnect && !isStationConnected) + if (mWiFiStationAutoConnect && isStationProvisioned) { // if the station is not connected, set the state to connecting if (mWiFiStationState == kWiFiStationState_NotConnected) @@ -285,15 +301,6 @@ void ConnectivityManagerImpl::DriveStationState() ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); switch (mWiFiStationState) { - case kWiFiStationState_NotConnected: { - } - break; - case kWiFiStationState_Connected: { - } - break; - case kWiFiStationState_Connecting_Succeeded: { - } - break; case kWiFiStationState_Connecting: { // connect the station to the access point using the credentials from the staging network err = WifiInterface::GetInstance().ConnectToAccessPoint(); // using the credentials from the staging network @@ -313,6 +320,8 @@ void ConnectivityManagerImpl::DriveStationState() // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); + + // drive the station state to connecting ChangeWiFiStationState(kWiFiStationState_Connecting, false); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); @@ -323,12 +332,10 @@ void ConnectivityManagerImpl::DriveStationState() // mWiFiStationReconnectCount++; } break; + case kWiFiStationState_Connected: + case kWiFiStationState_Connecting_Succeeded: case kWiFiStationState_Disconnecting: { - if (!isStationConnected) - { - ChangeWiFiStationState(kWiFiStationState_NotConnected, false); - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - } + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); } break; default: { From 2d850615639c260256b91a634fe4f4350928dc23 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 19 Sep 2026 00:05:44 +0530 Subject: [PATCH 53/67] Restyled by whitespace --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 04cf63ee10f..a5141cf607a 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -320,7 +320,7 @@ void ConnectivityManagerImpl::DriveStationState() // DriveStationState() will be called again to start a new connection attempt ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", System::Clock::Milliseconds32(timeToNextConnect).count()); - + // drive the station state to connecting ChangeWiFiStationState(kWiFiStationState_Connecting, false); ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); From d271b46f1601215d6e201b70a46d405156bbb170 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 19 Sep 2026 12:52:12 +0530 Subject: [PATCH 54/67] refactor(silabs-wifi): remove unused WiFi shell command includes and streamline shell task initialization --- examples/platform/silabs/MatterConfig.cpp | 8 -------- examples/platform/silabs/MatterShell.cpp | 11 ++++++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index bd8520eeaf6..686d65661a6 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -48,9 +48,6 @@ #ifdef ENABLE_CHIP_SHELL #include "MatterShell.h" -#ifdef SL_WIFI -#include -#endif // SL_WIFI #endif #ifdef HEAP_MONITORING @@ -436,11 +433,6 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) #ifdef ENABLE_CHIP_SHELL chip::startShellTask(); - -#ifdef SL_WIFI - chip::Shell::SetWiFiDriver(chip::DeviceLayer::NetworkCommissioning::SlWiFiDriver::GetInstance()); -#endif // SL_WIFI - #endif // ENABLE_CHIP_SHELL return CHIP_NO_ERROR; diff --git a/examples/platform/silabs/MatterShell.cpp b/examples/platform/silabs/MatterShell.cpp index 25b79accefa..639e629d6b6 100644 --- a/examples/platform/silabs/MatterShell.cpp +++ b/examples/platform/silabs/MatterShell.cpp @@ -28,7 +28,12 @@ #include "sl_cli_config.h" #include "sli_cli_io.h" #include -#endif +#endif // SL_CATALOG_CLI_PRESENT +#ifdef SL_WIFI +#include +#include +#include +#endif // SL_WIFI using namespace ::chip; using Shell::Engine; @@ -194,6 +199,10 @@ void startShellTask() cmd_otcli_init(); #endif +#ifdef SL_WIFI + Shell::SetWiFiDriver(DeviceLayer::NetworkCommissioning::SlWiFiDriver::GetInstance()); +#endif // SL_WIFI + #ifdef SL_CATALOG_CLI_PRESENT cmdSilabsInit(); #endif From aa0d6d8d9de1b5a865d743ebc348ba63c7f180fb Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 19 Sep 2026 16:30:01 +0530 Subject: [PATCH 55/67] refactor(silabs-wifi): streamline error handling in WiFi station initialization and state management --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index a5141cf607a..d105419bf9f 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -55,7 +55,6 @@ ConnectivityManagerImpl ConnectivityManagerImpl::sInstance; CHIP_ERROR ConnectivityManagerImpl::_Init() { - CHIP_ERROR err; mWiFiStationMode = kWiFiStationMode_Disabled; mWiFiStationState = kWiFiStationState_NotConnected; mWiFiStationAutoConnect = true; @@ -67,12 +66,11 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() // TODO Initialize the Chip Addressing and Routing Module. // Ensure that station mode is enabled. - err = SetWiFiStationMode(kWiFiStationMode_Enabled); - VerifyOrReturnError(err == CHIP_NO_ERROR, err); + ReturnErrorOnFailure(SetWiFiStationMode(kWiFiStationMode_Enabled)); // Queue work items to bootstrap the AP and station state machines once the Chip event loop is running. - err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); - return err; + ReturnErrorOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); + return CHIP_NO_ERROR; } void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) @@ -156,16 +154,14 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF // disconnect if wifi is connected if (IsWiFiStationConnected()) { - err = DisconnectNetwork(); - VerifyOrReturnError(err == CHIP_NO_ERROR, err); + ReturnErrorOnFailure(DisconnectNetwork()); } err = WifiInterface::GetInstance().DisableStationMode(); VerifyOrReturnError(err == CHIP_NO_ERROR || err == CHIP_ERROR_NOT_IMPLEMENTED, err); } break; case kWiFiStationMode_Enabled: { - err = WifiInterface::GetInstance().EnableStationMode(); - VerifyOrReturnError(err == CHIP_NO_ERROR, err); + ReturnErrorOnFailure(WifiInterface::GetInstance().EnableStationMode()); } break; default: @@ -274,9 +270,7 @@ void ConnectivityManagerImpl::DriveStationState() if (!isStationProvisioned) { ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); - err = DisconnectNetwork(); - VerifyOrReturn(err == CHIP_NO_ERROR, - ChipLogError(DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format())); + ReturnAndLogOnFailure(DisconnectNetwork(), DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format()); } } @@ -413,7 +407,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, // illegal state transition // disconnect the station to avoid further attempts to connect // done to align out of bound disconnection during connection attempt - VerifyOrReturn(DisconnectNetwork() == CHIP_NO_ERROR); + ReturnAndLogOnFailure(DisconnectNetwork(), DeviceLayer, "DisconnectNetwork failed"); return; } From 89658b65c8ae8f9dd5edd16191b8611c03d1b122 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sat, 19 Sep 2026 16:53:15 +0530 Subject: [PATCH 56/67] refactor(silabs-wifi): enhance error handling in WiFi state management by replacing TEMPORARY_RETURN_IGNORED with ReturnOnFailure --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index d105419bf9f..039ec314165 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -172,7 +172,7 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + ReturnErrorOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); return CHIP_NO_ERROR; } @@ -190,7 +190,7 @@ void ConnectivityManagerImpl::_ClearWiFiStationProvision(void) ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); WifiInterface::GetInstance().ClearWifiCredentials(); - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + ReturnOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); } CHIP_ERROR ConnectivityManagerImpl::_GetAndLogWifiStatsCounters(void) @@ -207,7 +207,7 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() { // Schedule a call to the DriveStationState method to adjust the station state as needed. ChipLogProgress(DeviceLayer, "_ON WIFI PROVISION CHANGE"); - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL); + ReturnOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); } CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) @@ -270,7 +270,7 @@ void ConnectivityManagerImpl::DriveStationState() if (!isStationProvisioned) { ChipLogDetail(DeviceLayer, "WiFi station is not provisioned and is connected, disconnecting"); - ReturnAndLogOnFailure(DisconnectNetwork(), DeviceLayer, "DisconnectNetwork failed: %" CHIP_ERROR_FORMAT, err.Format()); + ReturnOnFailure(DisconnectNetwork()); } } From 76881dbe61aedcc466cd66da338cb26740b4ac81 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Sun, 20 Sep 2026 18:26:03 +0530 Subject: [PATCH 57/67] refactor(silabs-wifi): improve error handling by replacing ReturnOnFailure with LogErrorOnFailure in WiFi state management and scanning processes --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 6 +++--- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 039ec314165..37500b75314 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -190,7 +190,7 @@ void ConnectivityManagerImpl::_ClearWiFiStationProvision(void) ChipLogProgress(DeviceLayer, "WiFi station is application controlled")); WifiInterface::GetInstance().ClearWifiCredentials(); - ReturnOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); + LogErrorOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); } CHIP_ERROR ConnectivityManagerImpl::_GetAndLogWifiStatsCounters(void) @@ -207,7 +207,7 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() { // Schedule a call to the DriveStationState method to adjust the station state as needed. ChipLogProgress(DeviceLayer, "_ON WIFI PROVISION CHANGE"); - ReturnOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); + LogErrorOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); } CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) @@ -317,7 +317,7 @@ void ConnectivityManagerImpl::DriveStationState() // drive the station state to connecting ChangeWiFiStationState(kWiFiStationState_Connecting, false); - ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); + LogErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL)); // TODO: Revisit this logic // increase the reconnect interval by the previous interval, for telescoping effect and reduce the frequency of diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index b4f29218401..3057d8eadf9 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -270,17 +270,17 @@ void SlWiFiDriver::OnScanWiFiNetworkDone(NetworkCommissioning::WiFiScanResponse if (mScanResponseIter.Count() == 0) { // if there is no network found, return kNetworkNotFound - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { + LogErrorOnFailure(DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kNetworkNotFound, CharSpan(), nullptr); nwDriver->mpScanCallback = nullptr; - }); + })); return; } - TEMPORARY_RETURN_IGNORED DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { + LogErrorOnFailure(DeviceLayer::SystemLayer().ScheduleLambda([nwDriver]() { nwDriver->mpScanCallback->OnFinished(NetworkCommissioning::Status::kSuccess, CharSpan(), &mScanResponseIter); nwDriver->mpScanCallback = nullptr; - }); + })); } else { From 13b08cc4a770768186cfde8348f2a422bed3a92f Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Mon, 21 Sep 2026 21:19:29 +0530 Subject: [PATCH 58/67] refactor(silabs-wifi): simplify configuration retrieval in RevertConfiguration by consolidating error handling for SSID and PSK --- src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 3057d8eadf9..cddeb3e7c1d 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -77,28 +77,28 @@ CHIP_ERROR SlWiFiDriver::RevertConfiguration() // If reading fails, wifi is not provisioned, no need to go further. err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiSSID, mSavedNetwork.ssid, sizeof(mSavedNetwork.ssid), mSavedNetwork.ssidLen); +#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) { -#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING memcpy(&mSavedNetwork.ssid, SL_WIFI_SSID, sizeof(SL_WIFI_SSID)); mSavedNetwork.ssidLen = sizeof(SL_WIFI_SSID); err = CHIP_NO_ERROR; -#endif // SL_ONNETWORK_PAIRING } +#endif // SL_ONNETWORK_PAIRING VerifyOrReturnError(err == CHIP_NO_ERROR, err); err = SilabsConfig::ReadConfigValueBin(SilabsConfig::kConfigKey_WiFiPSK, mSavedNetwork.key, sizeof(mSavedNetwork.key), mSavedNetwork.keyLen); +#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) { -#if defined(SL_ONNETWORK_PAIRING) && SL_ONNETWORK_PAIRING memcpy(&mSavedNetwork.key, SL_WIFI_PSK, sizeof(SL_WIFI_PSK)); mSavedNetwork.keyLen = sizeof(SL_WIFI_PSK); err = CHIP_NO_ERROR; -#endif // SL_ONNETWORK_PAIRING } +#endif // SL_ONNETWORK_PAIRING VerifyOrReturnError(err == CHIP_NO_ERROR, err); mStagingNetwork = mSavedNetwork; return err; From 1d88a90958aedc98964ad132f41b18b2b62ea985 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:36:03 +0530 Subject: [PATCH 59/67] refactor(silabs-wifi): enhance WiFi state management by adding networking status updates and refining state transition checks --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 37500b75314..41488928b6e 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -346,6 +346,7 @@ void ConnectivityManagerImpl::OnStationConnected() NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); // Cannot use the driver if the instance is not initialized. VerifyOrDie(nwDriver != nullptr); // should never be null + nwDriver->UpdateNetworkingStatus(); nwDriver->OnConnectWiFiNetwork(); UpdateInternetConnectivityState(); @@ -358,6 +359,11 @@ void ConnectivityManagerImpl::OnStationConnected() void ConnectivityManagerImpl::OnStationDisconnected() { + NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); + // Cannot use the driver if the instance is not initialized. + VerifyOrDie(nwDriver != nullptr); // should never be null + nwDriver->UpdateNetworkingStatus(); + // TODO: Invoke WARM to perform actions that occur when the WiFi station interface goes down. UpdateInternetConnectivityState(); // Alert other components of the new state. @@ -429,12 +435,6 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, { DriveStationState(); } - - // TODO: Remove this once the WiFi driver is updated to use the new state machine - NetworkCommissioning::SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance(); - // Cannot use the driver if the instance is not initialized. - VerifyOrDie(nwDriver != nullptr); // should never be null - nwDriver->UpdateNetworkingStatus(); } void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) From 553338d5aabd9de8716a9502468fa4ccbda84ef0 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:58:58 +0530 Subject: [PATCH 60/67] refactor(silabs-wifi): refine WiFi state transition logic and enhance logging for connection and disconnection events --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 41488928b6e..6f492b5cefd 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -98,13 +98,15 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: - DriveStationState(); - // ChangeWiFiStationState(kWiFiStationState_NotConnected); + ChangeWiFiStationState(kWiFiStationState_NotConnected); break; // Disconnection due to WiFi connectivity error default: - VerifyOrReturn(mWiFiStationState != kWiFiStationState_NotConnected, - ChipLogDetail(DeviceLayer, "Discard disconnect event as WiFi station is not connected")); + VerifyOrReturn( + mWiFiStationState == kWiFiStationState_Connecting || + mWiFiStationState == kWiFiStationState_Connecting_Succeeded || + mWiFiStationState == kWiFiStationState_Connected, + ChipLogDetail(DeviceLayer, "Discard disconnect event as WiFi station was not connecting or connected")); ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); break; } @@ -169,6 +171,7 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF break; } mWiFiStationAutoConnect = true; + ResetReconnectionWiFiStationState(); // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); @@ -393,7 +396,6 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. - WiFiStationState prevState = mWiFiStationState; mWiFiStationState = newState; switch (newState) { @@ -408,22 +410,15 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, case kWiFiStationState_Connecting_Succeeded: case kWiFiStationState_Connected: - if (prevState != kWiFiStationState_Connecting) - { - // illegal state transition - // disconnect the station to avoid further attempts to connect - // done to align out of bound disconnection during connection attempt - ReturnAndLogOnFailure(DisconnectNetwork(), DeviceLayer, "DisconnectNetwork failed"); - return; - } - ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Disconnecting: - ResetReconnectionWiFiStationState(); - mWiFiStationAutoConnect = false; + // TODO: Currently, `ConfigureLITConnect` is not managed by the ConnectivityManager. + // Once it is managed by the ConnectivityManager, this check can be enabled. + // mWiFiStationAutoConnect = false; + // ResetReconnectionWiFiStationState(); break; default: From 2cc039a88562d47df1548027674933c47e5616ec Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:59:25 +0530 Subject: [PATCH 61/67] refactor(silabs-wifi): enhance logging in DriveStationState and ensure reconnection state is reset correctly --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 6f492b5cefd..223256ebf45 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -255,7 +255,8 @@ void ConnectivityManagerImpl::DriveStationState() VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "StartWifiTask failed: %" CHIP_ERROR_FORMAT, err.Format())); // if the station mode is disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); - + ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); + ChipLogDetail(DeviceLayer, "isStationConnected: %d, isStationProvisioned: %d", isStationConnected, isStationProvisioned); if (isStationConnected) { // sync the station state with the actual state From f0ebff622992a54aedfe58cf67f1f9b8f50f1a2c Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 22 Sep 2026 20:55:11 +0530 Subject: [PATCH 62/67] refactor(silabs-wifi): enhance WiFi station state management by introducing previous state tracking and adjusting auto-connect logic --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 223256ebf45..49f833adb74 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -397,6 +397,7 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, WiFiStationStateToStr(newState)); // Commit the state before notifying. OnStationConnected() calls // UpdateInternetConnectivityState(), which only reports IPv6 when already Connected. + WiFiStationState prevState = mWiFiStationState; mWiFiStationState = newState; switch (newState) { @@ -406,20 +407,30 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, break; case kWiFiStationState_Connecting_Failed: + // TODO: Currently, `ConfigureLITConnect` is not managed by the ConnectivityManager. + // Once it is managed by the ConnectivityManager, this check can be removed. + if (prevState == kWiFiStationState_NotConnected) + { + mWiFiStationAutoConnect = true; + } OnStationDisconnected(); break; case kWiFiStationState_Connecting_Succeeded: case kWiFiStationState_Connected: + // TODO: Currently, `ConfigureLITConnect` is not managed by the ConnectivityManager. + // Once it is managed by the ConnectivityManager, this check can be removed. + if (prevState == kWiFiStationState_NotConnected) + { + mWiFiStationAutoConnect = true; + } ResetReconnectionWiFiStationState(); OnStationConnected(); break; case kWiFiStationState_Disconnecting: - // TODO: Currently, `ConfigureLITConnect` is not managed by the ConnectivityManager. - // Once it is managed by the ConnectivityManager, this check can be enabled. - // mWiFiStationAutoConnect = false; - // ResetReconnectionWiFiStationState(); + mWiFiStationAutoConnect = false; + ResetReconnectionWiFiStationState(); break; default: From cc5e992f326f6b90ed42915d7681c3361be961c3 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Tue, 22 Sep 2026 23:35:41 +0530 Subject: [PATCH 63/67] refactor(silabs-wifi): update auto-connect logic and clean up TODOs related to LIT connect management in ConnectivityManager --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 49f833adb74..f3c2b4714a9 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -98,6 +98,9 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: + // TODO: Remove this once the LIT connect is managed by the ConnectivityManager + // and the LIT disconnect is handled by the ConnectivityManager + mWiFiStationAutoConnect = false; ChangeWiFiStationState(kWiFiStationState_NotConnected); break; // Disconnection due to WiFi connectivity error @@ -170,8 +173,8 @@ CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiF // kWiFiStationMode_Application break; } + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); mWiFiStationAutoConnect = true; - ResetReconnectionWiFiStationState(); // do not schedule the DriveStationState if the station is not ready to be driven once the START UP EVENT is received VerifyOrReturnError(WifiInterface::GetInstance().IsStationReady(), CHIP_NO_ERROR, ChipLogDetail(DeviceLayer, "WiFi station is not ready")); @@ -216,7 +219,7 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { // if the station is not connected, return success - VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); + VerifyOrReturnError(mWiFiStationState == kWiFiStationState_Connected, CHIP_NO_ERROR); WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); @@ -256,7 +259,7 @@ void ConnectivityManagerImpl::DriveStationState() // if the station mode is disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); - ChipLogDetail(DeviceLayer, "isStationConnected: %d, isStationProvisioned: %d", isStationConnected, isStationProvisioned); + ChipLogDetail(DeviceLayer, "isStationConnected: %d, isStationProvisioned: %d, mWiFiStationAutoConnect: %d", isStationConnected, isStationProvisioned, mWiFiStationAutoConnect); if (isStationConnected) { // sync the station state with the actual state From 9f574d0a0c69c665a97ab8e9863c68f4474a50f7 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 23 Sep 2026 00:22:52 +0530 Subject: [PATCH 64/67] refactor(silabs-wifi): improve WiFi disconnection handling by introducing managed disconnect state and adjusting auto-connect logic --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index f3c2b4714a9..8dfa474b336 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -219,12 +219,13 @@ void ConnectivityManagerImpl::_OnWiFiStationProvisionChange() CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { // if the station is not connected, return success - VerifyOrReturnError(mWiFiStationState == kWiFiStationState_Connected, CHIP_NO_ERROR); + VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); + mWiFiStationAutoConnect = false; - WifiInterface::GetInstance().TriggerDisconnection(); ChangeWiFiStationState(kWiFiStationState_Disconnecting); // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() // next time DriveStationState() will be called, the station will be in the NotConnected state + WifiInterface::GetInstance().TriggerDisconnection(); return CHIP_NO_ERROR; } @@ -259,7 +260,8 @@ void ConnectivityManagerImpl::DriveStationState() // if the station mode is disabled, return VerifyOrReturn(stationMode != kWiFiStationMode_Disabled, ChipLogProgress(DeviceLayer, "WiFi station is disabled")); ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); - ChipLogDetail(DeviceLayer, "isStationConnected: %d, isStationProvisioned: %d, mWiFiStationAutoConnect: %d", isStationConnected, isStationProvisioned, mWiFiStationAutoConnect); + ChipLogDetail(DeviceLayer, "isStationConnected: %d, isStationProvisioned: %d, mWiFiStationAutoConnect: %d", isStationConnected, + isStationProvisioned, mWiFiStationAutoConnect); if (isStationConnected) { // sync the station state with the actual state @@ -299,7 +301,6 @@ void ConnectivityManagerImpl::DriveStationState() System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp(); System::Clock::Timestamp timeToNextConnect = System::Clock::kZero; - ChipLogDetail(DeviceLayer, "DriveStationState: %s", WiFiStationStateToStr(mWiFiStationState)); switch (mWiFiStationState) { case kWiFiStationState_Connecting: { @@ -432,7 +433,6 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, break; case kWiFiStationState_Disconnecting: - mWiFiStationAutoConnect = false; ResetReconnectionWiFiStationState(); break; From dcb4084d24dd6bc4293b4ee5e3927011cefaa2ee Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 23 Sep 2026 08:07:26 +0530 Subject: [PATCH 65/67] refactor(silabs-wifi): remove outdated TODO comments related to LIT connect management in disconnection handling --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 8dfa474b336..6fe019af626 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -98,9 +98,6 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: - // TODO: Remove this once the LIT connect is managed by the ConnectivityManager - // and the LIT disconnect is handled by the ConnectivityManager - mWiFiStationAutoConnect = false; ChangeWiFiStationState(kWiFiStationState_NotConnected); break; // Disconnection due to WiFi connectivity error From 393abde65b953e9e915c4e88e54980e3837cd1c8 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 23 Sep 2026 08:37:35 +0530 Subject: [PATCH 66/67] refactor(silabs-wifi): introduce disconnect pending state to improve WiFi disconnection handling and auto-connect logic --- src/platform/silabs/ConnectivityManagerImpl.h | 2 ++ .../silabs/ConnectivityManagerImpl_WIFI.cpp | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index e98307ab372..1fe249fae41 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -122,6 +122,8 @@ class ConnectivityManagerImpl final : public ConnectivityManager, WiFiStationMode mWiFiStationMode; WiFiStationState mWiFiStationState; bool mWiFiStationAutoConnect; + // TODO: Remove this once the LIT disconnect is managed by the ConnectivityManager + bool mWiFiStationDisconnectPending; // variables for tracking the last connection failure time and reconnect interval System::Clock::Timestamp mLastStationConnectFailTime; System::Clock::Timeout mWiFiStationReconnectInterval; diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 6fe019af626..54df8e4c0a5 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -58,6 +58,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() mWiFiStationMode = kWiFiStationMode_Disabled; mWiFiStationState = kWiFiStationState_NotConnected; mWiFiStationAutoConnect = true; + mWiFiStationDisconnectPending = false; mLastStationConnectFailTime = System::Clock::kZero; mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL); mWiFiStationReconnectCount = 1; @@ -98,7 +99,19 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) { // User initiated disconnection outside of the ConnectivityManager case NetworkCommissioning::Status::kSuccess: - ChangeWiFiStationState(kWiFiStationState_NotConnected); + if (mWiFiStationDisconnectPending) + { + mWiFiStationDisconnectPending = false; + ChangeWiFiStationState(kWiFiStationState_NotConnected); + } + else + { + // out of bound disconnect event, since WifiInterface::TriggerDisconnection() is not called + // from the ConnectivityManager, so we need to set the auto connect flag to false + // and drive the station state to not connected + mWiFiStationAutoConnect = false; + DriveStationState(); + } break; // Disconnection due to WiFi connectivity error default: @@ -217,7 +230,8 @@ CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { // if the station is not connected, return success VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); - mWiFiStationAutoConnect = false; + mWiFiStationAutoConnect = false; + mWiFiStationDisconnectPending = true; ChangeWiFiStationState(kWiFiStationState_Disconnecting); // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() From 7df0bd36ff4f3ed5564b3118fc753d1f0e7634e4 Mon Sep 17 00:00:00 2001 From: rosahay-silabs <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 23 Sep 2026 12:22:33 +0530 Subject: [PATCH 67/67] refactor(silabs-wifi): enhance disconnection handling by refining state transitions and improving auto-connect logic --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 54df8e4c0a5..3c768e12c97 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -230,13 +230,29 @@ CHIP_ERROR ConnectivityManagerImpl::_DisconnectNetwork(void) { // if the station is not connected, return success VerifyOrReturnError(mWiFiStationState != kWiFiStationState_NotConnected, CHIP_NO_ERROR); - mWiFiStationAutoConnect = false; - mWiFiStationDisconnectPending = true; - ChangeWiFiStationState(kWiFiStationState_Disconnecting); - // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() - // next time DriveStationState() will be called, the station will be in the NotConnected state - WifiInterface::GetInstance().TriggerDisconnection(); + mWiFiStationAutoConnect = false; + + if (mWiFiStationState == kWiFiStationState_Connecting) + { + // user requested to disconnect the network, while the device in connecting state + // reset the reconnection state to avoid the device to reconnect to the network + // if the on going connection attempt failed, the station will be in the NotConnected state. + // if the on going connection attempt succeeded, the station will be in the Connected state, + // driven by the OnPlatformEvent() callback + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); + } + else if (mWiFiStationState == kWiFiStationState_Connected || mWiFiStationState == kWiFiStationState_Connecting_Succeeded) + { + VerifyOrReturnError(!mWiFiStationDisconnectPending, CHIP_ERROR_IN_PROGRESS); + + mWiFiStationDisconnectPending = true; + ChangeWiFiStationState(kWiFiStationState_Disconnecting, false); + // ChangeWiFiStationState() is called in the OnPlatformEvent() callback as per result of TriggerDisconnection() + // next time DriveStationState() will be called, the station will be in the NotConnected state + WifiInterface::GetInstance().TriggerDisconnection(); + } + LogErrorOnFailure(DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL)); return CHIP_NO_ERROR; } @@ -346,7 +362,21 @@ void ConnectivityManagerImpl::DriveStationState() } break; case kWiFiStationState_Connected: - case kWiFiStationState_Connecting_Succeeded: + case kWiFiStationState_Connecting_Succeeded: { + // Unexpected radio-down while still Connected/Connecting_Succeeded. + // Prefer Connecting_Failed so reconnect is scheduled (same as error + // kDisconnect). Going straight to NotConnected resets the retry timer + // and skips a new join; a later kDisconnect is then discarded. + if (mWiFiStationAutoConnect && isStationProvisioned) + { + ChangeWiFiStationState(kWiFiStationState_Connecting_Failed); + } + else + { + ChangeWiFiStationState(kWiFiStationState_NotConnected, false); + } + } + break; case kWiFiStationState_Disconnecting: { ChangeWiFiStationState(kWiFiStationState_NotConnected, false); } @@ -428,7 +458,12 @@ void ConnectivityManagerImpl::ChangeWiFiStationState(WiFiStationState newState, { mWiFiStationAutoConnect = true; } - OnStationDisconnected(); + // Only notify link loss when an established (or succeeded) link dropped. + // Connecting -> Connecting_Failed is a failed join/retry, not a drop. + if (prevState == kWiFiStationState_Connected || prevState == kWiFiStationState_Connecting_Succeeded) + { + OnStationDisconnected(); + } break; case kWiFiStationState_Connecting_Succeeded: