From 8e9cfbf6a086b67525f89d18238ba340df527bd2 Mon Sep 17 00:00:00 2001
From: brosahay <3526930+brosahay@users.noreply.github.com>
Date: Wed, 12 Mar 2025 03:38:06 +0530
Subject: [PATCH 1/4] Adds `GetSupportedWiFiBandsMask` API

---
 .../silabs/NetworkCommissioningWiFiDriver.cpp    |  5 +++++
 .../silabs/NetworkCommissioningWiFiDriver.h      |  1 +
 src/platform/silabs/wifi/BUILD.gn                |  1 +
 src/platform/silabs/wifi/WifiInterface.h         | 16 ++++++++++++++++
 4 files changed, 23 insertions(+)

diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
index f021f9d8c3ad8f..b4ee08385ae1ff 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
@@ -258,6 +258,11 @@ chip::BitFlags<WiFiSecurity> SlWiFiDriver::ConvertSecuritytype(wfx_sec_t securit
     return securityType;
 }
 
+uint32_t SlWiFiDriver::GetSupportedWiFiBandsMask() const
+{
+    return WifiInterface::GetInstance()._GetSupportedWiFiBandsMask();
+}
+
 bool SlWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
 {
     ChipLogProgress(DeviceLayer, "Start Scan WiFi Networks");
diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.h b/src/platform/silabs/NetworkCommissioningWiFiDriver.h
index 8377770aee764e..8061a1423f90cd 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.h
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.h
@@ -123,6 +123,7 @@ class SlWiFiDriver final : public WiFiDriver
     CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen);
 
     chip::BitFlags<WiFiSecurity> ConvertSecuritytype(wfx_sec_t security);
+    uint32_t GetSupportedWiFiBandsMask() const override;
 
     void OnConnectWiFiNetwork();
     void UpdateNetworkingStatus();
diff --git a/src/platform/silabs/wifi/BUILD.gn b/src/platform/silabs/wifi/BUILD.gn
index 32c21754223fcd..f272437ff8db30 100644
--- a/src/platform/silabs/wifi/BUILD.gn
+++ b/src/platform/silabs/wifi/BUILD.gn
@@ -113,6 +113,7 @@ source_set("wifi-platform") {
     "${chip_root}/src/app/icd/server:icd-server-config",
     "${chip_root}/src/inet",
     "${chip_root}/src/lib/support",
+    "${chip_root}/src/platform:platform_base",
   ]
 
   if (use_rs9116) {
diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h
index 429e21e8ddcd27..264908efdb54a2 100644
--- a/src/platform/silabs/wifi/WifiInterface.h
+++ b/src/platform/silabs/wifi/WifiInterface.h
@@ -16,7 +16,9 @@
  */
 #pragma once
 
+#include <app-common/zap-generated/cluster-enums.h>
 #include <app/icd/server/ICDServerConfig.h>
+
 #include <array>
 #include <cmsis_os2.h>
 #include <lib/support/BitFlags.h>
@@ -410,6 +412,20 @@ class WifiInterface
      */
     virtual void CancelScanNetworks() = 0;
 
+    using WiFiBandEnum = app::Clusters::NetworkCommissioning::WiFiBandEnum;
+    /**
+     *  @brief Provide all the frequency bands supported by the Wi-Fi interface.
+     *
+     *  The default implementation returns the 2.4 GHz band support.
+     *
+     *  @return a bitmask of supported Wi-Fi bands where each bit is associated with a WiFiBandEnum value.
+     */
+    virtual uint32_t _GetSupportedWiFiBandsMask() const
+    {
+        // Default to 2.4G support only
+        return static_cast<uint32_t>(1UL << chip::to_underlying(WiFiBandEnum::k2g4));
+    }
+
 protected:
     /**
      * @brief Function notifies the PlatformManager that an IPv6 event occured on the WiFi interface.

From 23dae4840cafe2761d33883c8df4dae93de5f6e4 Mon Sep 17 00:00:00 2001
From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com>
Date: Mon, 17 Mar 2025 13:13:34 +0530
Subject: [PATCH 2/4] Refactor WiFi band mask methods for consistency in naming

---
 src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 2 +-
 src/platform/silabs/wifi/WifiInterface.h               | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
index b4ee08385ae1ff..231f5ee2c6064c 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
@@ -260,7 +260,7 @@ chip::BitFlags<WiFiSecurity> SlWiFiDriver::ConvertSecuritytype(wfx_sec_t securit
 
 uint32_t SlWiFiDriver::GetSupportedWiFiBandsMask() const
 {
-    return WifiInterface::GetInstance()._GetSupportedWiFiBandsMask();
+    return WifiInterface::GetInstance().GetSupportedWiFiBandsMask();
 }
 
 bool SlWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h
index 264908efdb54a2..550d8dd44cc9b2 100644
--- a/src/platform/silabs/wifi/WifiInterface.h
+++ b/src/platform/silabs/wifi/WifiInterface.h
@@ -420,7 +420,7 @@ class WifiInterface
      *
      *  @return a bitmask of supported Wi-Fi bands where each bit is associated with a WiFiBandEnum value.
      */
-    virtual uint32_t _GetSupportedWiFiBandsMask() const
+    virtual uint32_t GetSupportedWiFiBandsMask() const
     {
         // Default to 2.4G support only
         return static_cast<uint32_t>(1UL << chip::to_underlying(WiFiBandEnum::k2g4));

From bc167871524d55b1027cec2a8b97604c0ad8ddec Mon Sep 17 00:00:00 2001
From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com>
Date: Mon, 17 Mar 2025 13:14:27 +0530
Subject: [PATCH 3/4] Fix WiFi band enum reference in GetSupportedWiFiBandsMask
 implementation

---
 src/platform/silabs/wifi/WifiInterface.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h
index 550d8dd44cc9b2..85d51b0e46fcbf 100644
--- a/src/platform/silabs/wifi/WifiInterface.h
+++ b/src/platform/silabs/wifi/WifiInterface.h
@@ -412,7 +412,6 @@ class WifiInterface
      */
     virtual void CancelScanNetworks() = 0;
 
-    using WiFiBandEnum = app::Clusters::NetworkCommissioning::WiFiBandEnum;
     /**
      *  @brief Provide all the frequency bands supported by the Wi-Fi interface.
      *
@@ -423,7 +422,7 @@ class WifiInterface
     virtual uint32_t GetSupportedWiFiBandsMask() const
     {
         // Default to 2.4G support only
-        return static_cast<uint32_t>(1UL << chip::to_underlying(WiFiBandEnum::k2g4));
+        return static_cast<uint32_t>(1UL << chip::to_underlying(app::Clusters::NetworkCommissioning::WiFiBandEnum::k2g4));
     }
 
 protected:

From 73964a2d4dd699f130a2923b13de4194e935f153 Mon Sep 17 00:00:00 2001
From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com>
Date: Mon, 17 Mar 2025 18:45:16 +0530
Subject: [PATCH 4/4] Adds support for WiFi band scan results (#326)

* Add `WiFiBandEnum` to scan callback struct

* Fix typo in variable name for scanned SSID length in BackgroundScanCallback

* Add WiFiBandEnum usage to WiFi interface implementations

* Add WiFi band information to scan response in SlWiFiDriver

* Refactor WiFiBandEnum usage to fully qualify the namespace in WifiInterface.h

---------

Co-authored-by: brosahay <3526930+brosahay@users.noreply.github.com>
---
 src/platform/silabs/NetworkCommissioningWiFiDriver.cpp | 1 +
 src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp    | 9 ++++++---
 src/platform/silabs/wifi/WifiInterface.h               | 3 ++-
 src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp  | 3 +++
 src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp   | 3 +++
 5 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
index 231f5ee2c6064c..0a721a2dfd7357 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
@@ -310,6 +310,7 @@ void SlWiFiDriver::OnScanWiFiNetworkDone(wfx_wifi_scan_result_t * aScanResult)
         scanResponse.ssidLen = aScanResult->ssid_length;
         memcpy(scanResponse.ssid, aScanResult->ssid, scanResponse.ssidLen);
         memcpy(scanResponse.bssid, aScanResult->bssid, sizeof(scanResponse.bssid));
+        scanResponse.wiFiBand = aScanResult->wiFiBand;
 
         mScanResponseIter.Add(&scanResponse);
     }
diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
index e9bf54ca32262c..21486e7b8e7423 100644
--- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
@@ -68,6 +68,7 @@ extern "C" {
 #endif // CHIP_CONFIG_ENABLE_ICD_SERVER
 
 using namespace chip::DeviceLayer::Silabs;
+using WiFiBandEnum = chip::app::Clusters::NetworkCommissioning::WiFiBandEnum;
 
 // TODO : Temporary work-around for wifi-init failure in 917NCP ACX module boards.
 // Can be removed after Wiseconnect fixes region code for all ACX module boards.
@@ -200,9 +201,9 @@ sl_status_t BackgroundScanCallback(sl_wifi_event_t event, sl_wifi_scan_result_t
     {
         wfx_wifi_scan_result_t currentScanResult = { 0 };
 
-        // Lenght excludes null-character
-        size_t scannedSsidLenght = strnlen(reinterpret_cast<char *>(result->scan_info[i].ssid), WFX_MAX_SSID_LENGTH);
-        chip::ByteSpan scannedSsidSpan(result->scan_info[i].ssid, scannedSsidLenght);
+        // Length excludes null-character
+        size_t scannedSsidLength = strnlen(reinterpret_cast<char *>(result->scan_info[i].ssid), WFX_MAX_SSID_LENGTH);
+        chip::ByteSpan scannedSsidSpan(result->scan_info[i].ssid, scannedSsidLength);
 
         // Copy the scanned SSID to the current scan ssid buffer that will be forwarded to the callback
         chip::MutableByteSpan currentScanSsid(currentScanResult.ssid, WFX_MAX_SSID_LENGTH);
@@ -217,6 +218,8 @@ sl_status_t BackgroundScanCallback(sl_wifi_event_t event, sl_wifi_scan_result_t
         currentScanResult.security = static_cast<wfx_sec_t>(result->scan_info[i].security_mode);
         currentScanResult.rssi     = (-1) * result->scan_info[i].rssi_val; // The returned value is positive - we need to flip it
         currentScanResult.chan     = result->scan_info[i].rf_channel;
+        // TODO: change this when SDK provides values
+        currentScanResult.wiFiBand = WiFiBandEnum::k2g4;
 
         // if user has provided ssid, check if the current scan result ssid matches the user provided ssid
         if (!requestedSsidSpan.empty())
diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h
index 85d51b0e46fcbf..2187112edd00b2 100644
--- a/src/platform/silabs/wifi/WifiInterface.h
+++ b/src/platform/silabs/wifi/WifiInterface.h
@@ -73,6 +73,7 @@ typedef struct wfx_wifi_scan_result
     uint8_t bssid[kWifiMacAddressLength];
     uint8_t chan;
     int16_t rssi; /* I suspect this is in dBm - so signed */
+    chip::app::Clusters::NetworkCommissioning::WiFiBandEnum wiFiBand;
 } wfx_wifi_scan_result_t;
 using ScanCallback = void (*)(wfx_wifi_scan_result_t *);
 
@@ -422,7 +423,7 @@ class WifiInterface
     virtual uint32_t GetSupportedWiFiBandsMask() const
     {
         // Default to 2.4G support only
-        return static_cast<uint32_t>(1UL << chip::to_underlying(app::Clusters::NetworkCommissioning::WiFiBandEnum::k2g4));
+        return static_cast<uint32_t>(1UL << chip::to_underlying(chip::app::Clusters::NetworkCommissioning::WiFiBandEnum::k2g4));
     }
 
 protected:
diff --git a/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp
index 8276360a381bc2..27129fad1ac10f 100644
--- a/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp
@@ -55,6 +55,7 @@ extern "C" {
 WfxRsi_t wfx_rsi;
 
 using namespace chip::DeviceLayer::Silabs;
+using WiFiBandEnum = chip::app::Clusters::NetworkCommissioning::WiFiBandEnum;
 
 namespace {
 
@@ -376,6 +377,8 @@ void WifiInterfaceImpl::ProcessEvent(WifiPlatformEvent event)
             chip::MutableByteSpan bssidSpan(ap.bssid, kWifiMacAddressLength);
             chip::ByteSpan scanBssidSpan(scan.bssid, kWifiMacAddressLength);
             chip::CopySpanToMutableSpan(scanBssidSpan, bssidSpan);
+            // TODO: change this when SDK provides values
+            ap.wiFiBand = WiFiBandEnum::k2g4;
 
             wfx_rsi.scan_cb(&ap);
 
diff --git a/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp
index 538e822e8234f9..8806edb5b62bc1 100644
--- a/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp
@@ -42,6 +42,7 @@
 using namespace ::chip;
 using namespace ::chip::DeviceLayer;
 using namespace ::chip::DeviceLayer::Silabs;
+using WiFiBandEnum = chip::app::Clusters::NetworkCommissioning::WiFiBandEnum;
 
 // TODO: This is a workaround because we depend on the platform lib which depends on the platform implementation.
 //       As such we can't depend on the platform here as well
@@ -483,6 +484,8 @@ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_res
 
     ap->scan.chan = scan_result->channel;
     ap->scan.rssi = ConvertRcpiToRssi(scan_result->rcpi);
+    // WF200 only supports 2.4GHz band
+    ap->scan.wiFiBand = WiFiBandEnum::k2g4;
 
     chip::ByteSpan scannedBssid(scan_result->mac, kWifiMacAddressLength);
     chip::MutableByteSpan outputBssid(ap->scan.bssid, kWifiMacAddressLength);