diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index f021f9d8c3ad8f..0a721a2dfd7357 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -258,6 +258,11 @@ chip::BitFlags 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"); @@ -305,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/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 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/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(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(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(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 429e21e8ddcd27..2187112edd00b2 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -16,7 +16,9 @@ */ #pragma once +#include #include + #include #include #include @@ -71,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 *); @@ -410,6 +413,19 @@ class WifiInterface */ virtual void CancelScanNetworks() = 0; + /** + * @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(1UL << chip::to_underlying(chip::app::Clusters::NetworkCommissioning::WiFiBandEnum::k2g4)); + } + protected: /** * @brief Function notifies the PlatformManager that an IPv6 event occured on the WiFi interface. 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);