[SILABS] Adds support for WiFi band details (#38051)
* Adds `GetSupportedWiFiBandsMask` API
* Refactor WiFi band mask methods for consistency in naming
* Fix WiFi band enum reference in GetSupportedWiFiBandsMask implementation
* 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>
---------
Co-authored-by: brosahay <3526930+brosahay@users.noreply.github.com>
diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
index f021f9d..0a721a2 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
@@ -258,6 +258,11 @@
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 @@
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 8377770..8061a14 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.h
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.h
@@ -123,6 +123,7 @@
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 ef42ff7..0e7f396 100644
--- a/src/platform/silabs/wifi/BUILD.gn
+++ b/src/platform/silabs/wifi/BUILD.gn
@@ -113,6 +113,7 @@
"${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 402bd44..3e2c51b 100644
--- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
@@ -68,6 +68,7 @@
#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.
@@ -201,9 +202,9 @@
{
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);
@@ -218,6 +219,8 @@
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 429e21e..2187112 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>
@@ -71,6 +73,7 @@
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 @@
*/
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<uint32_t>(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 045564d..2fabd29 100644
--- a/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp
@@ -55,6 +55,7 @@
WfxRsi_t wfx_rsi;
using namespace chip::DeviceLayer::Silabs;
+using WiFiBandEnum = chip::app::Clusters::NetworkCommissioning::WiFiBandEnum;
namespace {
@@ -379,6 +380,8 @@
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 538e822..8806edb 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 @@
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);