Skip to content

Commit 9ff893d

Browse files
[Silabs] Refactor WiFi scan result handling to use NetworkCommissioning::WiFiScanResponse (project-chip#43591)
* Refactor WiFi BSSID handling in DiagnosticDataProviderImpl to use constant for BSSID length. * Refactor WiFi scan result handling to use NetworkCommissioning::WiFiScanResponse Updated the DiagnosticDataProviderImpl and WiFi driver implementations to replace the usage of wfx_wifi_scan_result_t with the new NetworkCommissioning::WiFiScanResponse structure. This change improves consistency and aligns with the recent refactoring of WiFi structures. Adjustments were made to method signatures and internal logic to accommodate the new data structure across multiple files, enhancing the overall clarity and maintainability of the codebase. * Restyled by clang-format * Refactor DiagnosticDataProviderImpl to streamline namespace usage * Remove additional comment * Revert include reordering * Remove unnecessary type verification in BackgroundScanCallback for requested SSID pointer * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent 07f6f9e commit 9ff893d

6 files changed

Lines changed: 69 additions & 85 deletions

File tree

src/platform/silabs/DiagnosticDataProviderImpl.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <platform/internal/CHIPDeviceLayerInternal.h>
2525

2626
#include <platform/DiagnosticDataProvider.h>
27+
#include <platform/NetworkCommissioning.h>
2728
#include <platform/silabs/DiagnosticDataProviderImpl.h>
2829
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
2930
#include <platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h>
@@ -35,6 +36,8 @@
3536
#include <sl_cmsis_os2_common.h>
3637

3738
using namespace ::chip::app::Clusters::GeneralDiagnostics;
39+
using namespace ::chip::DeviceLayer::NetworkCommissioning;
40+
using namespace ::chip::DeviceLayer::Internal;
3841

3942
namespace chip {
4043
namespace DeviceLayer {
@@ -335,15 +338,14 @@ void DiagnosticDataProviderImpl::ReleaseNetworkInterfaces(NetworkInterface * net
335338
#if defined(SL_WIFI) && SL_WIFI
336339
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBssId(MutableByteSpan & BssId)
337340
{
338-
constexpr size_t bssIdSize = 6;
339-
wfx_wifi_scan_result_t ap = { 0 };
341+
WiFiScanResponse ap = {};
340342

341-
VerifyOrReturnError(BssId.size() >= bssIdSize, CHIP_ERROR_BUFFER_TOO_SMALL);
343+
VerifyOrReturnError(BssId.size() >= kWiFiBSSIDLength, CHIP_ERROR_BUFFER_TOO_SMALL);
342344

343345
if (Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap) == CHIP_NO_ERROR)
344346
{
345-
memcpy(BssId.data(), ap.bssid, bssIdSize);
346-
BssId.reduce_size(bssIdSize);
347+
memcpy(BssId.data(), ap.bssid, kWiFiBSSIDLength);
348+
BssId.reduce_size(kWiFiBSSIDLength);
347349
return CHIP_NO_ERROR;
348350
}
349351

@@ -355,8 +357,8 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiSecurityType(app::Clusters::WiFiNe
355357
using app::Clusters::NetworkCommissioning::WiFiSecurityBitmap;
356358
using app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum;
357359

358-
wfx_wifi_scan_result_t ap = { 0 };
359-
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
360+
WiFiScanResponse ap = {};
361+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
360362
VerifyOrReturnError(error == CHIP_NO_ERROR, error);
361363

362364
// Map Matter WiFiSecurityBitmap to WiFiNetworkDiagnostics SecurityTypeEnum (prefer highest)
@@ -395,23 +397,23 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiVersion(app::Clusters::WiFiNetwork
395397

396398
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiChannelNumber(uint16_t & channelNumber)
397399
{
398-
wfx_wifi_scan_result_t ap = { 0 };
399-
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
400+
WiFiScanResponse ap = {};
401+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
400402
if (error == CHIP_NO_ERROR)
401403
{
402-
channelNumber = ap.chan;
404+
channelNumber = ap.channel;
403405
return CHIP_NO_ERROR;
404406
}
405407
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
406408
}
407409

408410
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiRssi(int8_t & rssi)
409411
{
410-
wfx_wifi_scan_result_t ap = { 0 };
411-
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
412+
WiFiScanResponse ap = {};
413+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
412414
if (error == CHIP_NO_ERROR)
413415
{
414-
rssi = ap.rssi;
416+
rssi = ap.signal.strength;
415417
return CHIP_NO_ERROR;
416418
}
417419
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;

src/platform/silabs/NetworkCommissioningWiFiDriver.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ bool SlWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
249249
return true;
250250
}
251251

252-
void SlWiFiDriver::OnScanWiFiNetworkDone(wfx_wifi_scan_result_t * aScanResult)
252+
void SlWiFiDriver::OnScanWiFiNetworkDone(NetworkCommissioning::WiFiScanResponse * aScanResult)
253253
{
254254
SlWiFiDriver * nwDriver = NetworkCommissioning::SlWiFiDriver::GetInstance();
255255
// Cannot use the driver if the instance is not initialized.
@@ -278,18 +278,7 @@ void SlWiFiDriver::OnScanWiFiNetworkDone(wfx_wifi_scan_result_t * aScanResult)
278278
}
279279
else
280280
{
281-
NetworkCommissioning::WiFiScanResponse scanResponse = {};
282-
283-
scanResponse.security = aScanResult->security;
284-
scanResponse.channel = aScanResult->chan;
285-
scanResponse.signal.type = NetworkCommissioning::WirelessSignalType::kdBm;
286-
scanResponse.signal.strength = aScanResult->rssi;
287-
scanResponse.ssidLen = aScanResult->ssid_length;
288-
memcpy(scanResponse.ssid, aScanResult->ssid, scanResponse.ssidLen);
289-
memcpy(scanResponse.bssid, aScanResult->bssid, sizeof(scanResponse.bssid));
290-
scanResponse.wiFiBand = aScanResult->wiFiBand;
291-
292-
mScanResponseIter.Add(&scanResponse);
281+
mScanResponseIter.Add(aScanResult);
293282
}
294283
}
295284

src/platform/silabs/NetworkCommissioningWiFiDriver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class SlWiFiDriver final : public WiFiDriver
123123
private:
124124
bool NetworkMatch(const Silabs::WifiInterface::WiFiCredentials & network, ByteSpan networkId);
125125
bool StartScanWiFiNetworks(ByteSpan ssid);
126-
static void OnScanWiFiNetworkDone(wfx_wifi_scan_result_t * aScanResult);
126+
static void OnScanWiFiNetworkDone(NetworkCommissioning::WiFiScanResponse * aScanResult);
127127

128128
static SlWiFiDriver * mDriver;
129129
Silabs::WifiInterface::WiFiCredentials mSavedNetwork = {};

src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@
2222
#include "ble_config.h"
2323
#include "sl_status.h"
2424
#include "sl_wifi_device.h"
25+
26+
#include <algorithm>
2527
#include <app/icd/server/ICDServerConfig.h>
2628
#include <cmsis_os2.h>
2729
#include <inet/IPAddress.h>
2830
#include <lib/support/CHIPMem.h>
2931
#include <lib/support/CHIPMemString.h>
3032
#include <lib/support/logging/CHIPLogging.h>
33+
#include <platform/NetworkCommissioning.h>
3134
#include <platform/silabs/wifi/SiWx/WifiInterfaceImpl.h>
3235
#include <sl_cmsis_os2_common.h>
3336

@@ -271,60 +274,58 @@ sl_status_t BackgroundScanCallback(sl_wifi_event_t event, sl_wifi_scan_result_t
271274
VerifyOrReturnError(result != nullptr, SL_STATUS_NULL_POINTER);
272275
VerifyOrReturnError(wfx_rsi.scan_cb != nullptr, SL_STATUS_INVALID_HANDLE);
273276

274-
sl_wifi_ssid_t * requestedSsidPtr = nullptr;
275-
chip::ByteSpan requestedSsidSpan;
276-
// arg is the requested SSID pointer passed during sl_wifi_set_scan_callback
277+
chip::ByteSpan requestedSsidSpan = {};
278+
279+
// arg is set to requested SSID if provided in sl_wifi_set_scan_callback
277280
if (arg != nullptr)
278281
{
279-
requestedSsidPtr = reinterpret_cast<sl_wifi_ssid_t *>(arg);
280-
requestedSsidSpan = chip::ByteSpan(requestedSsidPtr->value, requestedSsidPtr->length);
282+
sl_wifi_ssid_t * requestedSsidPtr = static_cast<sl_wifi_ssid_t *>(arg);
283+
requestedSsidSpan = chip::ByteSpan(requestedSsidPtr->value, requestedSsidPtr->length);
281284
}
282285

283286
uint32_t nbreResults = result->scan_count;
284287
for (uint32_t i = 0; i < nbreResults; i++)
285288
{
286-
wfx_wifi_scan_result_t currentScanResult = { 0 };
287-
288289
// Length excludes null-character
289-
size_t scannedSsidLength = strnlen(reinterpret_cast<char *>(result->scan_info[i].ssid), kMaxWiFiSSIDLength);
290-
chip::ByteSpan scannedSsidSpan(result->scan_info[i].ssid, scannedSsidLength);
291-
292-
// Copy the scanned SSID to the current scan ssid buffer that will be forwarded to the callback
293-
chip::MutableByteSpan currentScanSsid(currentScanResult.ssid, kMaxWiFiSSIDLength);
294-
ReturnValueOnFailure(chip::CopySpanToMutableSpan(scannedSsidSpan, currentScanSsid),
295-
SL_STATUS_SI91X_MEMORY_IS_NOT_SUFFICIENT);
296-
currentScanResult.ssid_length = currentScanSsid.size();
297-
298-
chip::ByteSpan inBssid(result->scan_info[i].bssid, kWiFiBSSIDLength);
299-
chip::MutableByteSpan outBssid(currentScanResult.bssid, kWiFiBSSIDLength);
300-
ReturnValueOnFailure(chip::CopySpanToMutableSpan(inBssid, outBssid), SL_STATUS_SI91X_MEMORY_IS_NOT_SUFFICIENT);
301-
302-
currentScanResult.security =
303-
ConvertSlWifiSecurityToBitmap(static_cast<sl_wifi_security_t>(result->scan_info[i].security_mode));
304-
currentScanResult.rssi = (-1) * result->scan_info[i].rssi_val; // The returned value is positive - we need to flip it
305-
currentScanResult.chan = result->scan_info[i].rf_channel;
306-
// TODO: change this when SDK provides values
307-
currentScanResult.wiFiBand = WiFiBandEnum::k2g4;
308-
309-
// if user has provided ssid, check if the current scan result ssid matches the user provided ssid
310-
// NOTE: background scan does not filter by ssid, so we need to do it here
311-
if (!requestedSsidSpan.empty())
312-
{
313-
if (requestedSsidSpan.data_equal(currentScanSsid))
314-
{
315-
wfx_rsi.scan_cb(&currentScanResult);
316-
}
317-
}
318-
else // No ssid was provide - forward all results
290+
size_t ssidLen = strnlen(reinterpret_cast<char *>(result->scan_info[i].ssid), kMaxWiFiSSIDLength);
291+
chip::ByteSpan ssidSpan(result->scan_info[i].ssid, ssidLen);
292+
293+
if (requestedSsidSpan.empty() || requestedSsidSpan.data_equal(ssidSpan))
319294
{
295+
296+
// Create a new scan response for the current scan result
297+
chip::DeviceLayer::NetworkCommissioning::WiFiScanResponse currentScanResult = {};
298+
299+
// Copy the scanned SSID to the scan response
300+
chip::MutableByteSpan responseSsidSpan(currentScanResult.ssid, kMaxWiFiSSIDLength);
301+
VerifyOrReturnError(chip::CopySpanToMutableSpan(ssidSpan, responseSsidSpan) == CHIP_NO_ERROR,
302+
SL_STATUS_SI91X_MEMORY_IS_NOT_SUFFICIENT);
303+
currentScanResult.ssidLen = static_cast<uint8_t>(ssidLen);
304+
305+
// Copy the BSSID to the scan response
306+
chip::ByteSpan bssidSpan(result->scan_info[i].bssid, kWiFiBSSIDLength);
307+
chip::MutableByteSpan responseBssidSpan(currentScanResult.bssid, kWiFiBSSIDLength);
308+
VerifyOrReturnError(chip::CopySpanToMutableSpan(bssidSpan, responseBssidSpan) == CHIP_NO_ERROR,
309+
SL_STATUS_SI91X_MEMORY_IS_NOT_SUFFICIENT);
310+
311+
// Convert the RSSI to a int8_t value
312+
int16_t rssi = std::clamp(((-1) * result->scan_info[i].rssi_val), INT8_MIN, INT8_MAX);
313+
314+
currentScanResult.signal.strength = static_cast<int8_t>(rssi);
315+
currentScanResult.signal.type = chip::DeviceLayer::NetworkCommissioning::WirelessSignalType::kdBm;
316+
317+
currentScanResult.channel = static_cast<uint16_t>(result->scan_info[i].rf_channel);
318+
currentScanResult.wiFiBand = WiFiBandEnum::k2g4;
319+
320+
currentScanResult.security =
321+
ConvertSlWifiSecurityToBitmap(static_cast<sl_wifi_security_t>(result->scan_info[i].security_mode));
322+
320323
wfx_rsi.scan_cb(&currentScanResult);
321324
}
322325
}
323-
326+
// null callback to indicate that the scan is complete
324327
wfx_rsi.scan_cb(nullptr);
325-
// cleanup and return
326328
wfx_rsi.scan_cb = nullptr;
327-
328329
wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kScanStarted);
329330
osSemaphoreRelease(sScanCompleteSemaphore);
330331

@@ -807,7 +808,7 @@ sl_status_t WifiInterfaceImpl::JoinCallback(sl_wifi_event_t event, char * result
807808
return status;
808809
}
809810

810-
CHIP_ERROR WifiInterfaceImpl::GetAccessPointInfo(wfx_wifi_scan_result_t & info)
811+
CHIP_ERROR WifiInterfaceImpl::GetAccessPointInfo(NetworkCommissioning::WiFiScanResponse & info)
811812
{
812813
// TODO: Convert this to a int8
813814
int32_t rssi = 0;
@@ -836,19 +837,21 @@ CHIP_ERROR WifiInterfaceImpl::GetAccessPointInfo(wfx_wifi_scan_result_t & info)
836837
}
837838

838839
info.security = wfx_rsi.credentials.security;
839-
info.chan = wfx_rsi.ap_chan;
840+
info.channel = wfx_rsi.ap_chan;
841+
info.wiFiBand = WiFiBandEnum::k2g4;
840842

841843
chip::MutableByteSpan output(info.ssid, kMaxWiFiSSIDLength);
842844
chip::ByteSpan ssid(wfx_rsi.credentials.ssid, wfx_rsi.credentials.ssidLen);
843845
ReturnErrorOnFailure(chip::CopySpanToMutableSpan(ssid, output));
844-
info.ssid_length = output.size();
846+
info.ssidLen = static_cast<uint8_t>(output.size());
845847
chip::ByteSpan apBssidSpan(wfx_rsi.ap_bssid.data(), wfx_rsi.ap_bssid.size());
846848
chip::MutableByteSpan bssidSpan(info.bssid, kWiFiBSSIDLength);
847849
ReturnErrorOnFailure(chip::CopySpanToMutableSpan(apBssidSpan, bssidSpan));
848850

849851
// TODO: add error processing
850852
sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &(rssi));
851-
info.rssi = rssi;
853+
info.signal.strength = static_cast<int8_t>(std::clamp(rssi, static_cast<int32_t>(INT8_MIN), static_cast<int32_t>(INT8_MAX)));
854+
info.signal.type = NetworkCommissioning::WirelessSignalType::kdBm;
852855
return CHIP_NO_ERROR;
853856
}
854857

src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class WifiInterfaceImpl final : public WifiInterface
6767
void CancelScanNetworks() override;
6868
bool IsWifiProvisioned() override;
6969
CHIP_ERROR InitWiFiStack(void) override;
70-
CHIP_ERROR GetAccessPointInfo(wfx_wifi_scan_result_t & info) override;
70+
CHIP_ERROR GetAccessPointInfo(chip::DeviceLayer::NetworkCommissioning::WiFiScanResponse & info) override;
7171
CHIP_ERROR GetAccessPointExtendedInfo(wfx_wifi_scan_ext_t & info) override;
7272
CHIP_ERROR ResetCounters() override;
7373

src/platform/silabs/wifi/WifiInterface.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,7 @@ constexpr size_t kWiFiMacAddressLength = 6;
4343
/* Defines to update */
4444
#define MAX_JOIN_RETRIES_COUNT (5)
4545

46-
typedef struct wfx_wifi_scan_result
47-
{
48-
uint8_t ssid[chip::DeviceLayer::Internal::kMaxWiFiSSIDLength]; // excludes null-character
49-
size_t ssid_length;
50-
chip::BitFlags<chip::app::Clusters::NetworkCommissioning::WiFiSecurityBitmap> security;
51-
uint8_t bssid[chip::DeviceLayer::Internal::kWiFiBSSIDLength];
52-
uint8_t chan;
53-
int16_t rssi; /* I suspect this is in dBm - so signed */
54-
chip::app::Clusters::NetworkCommissioning::WiFiBandEnum wiFiBand;
55-
} wfx_wifi_scan_result_t;
56-
using ScanCallback = void (*)(wfx_wifi_scan_result_t *);
46+
using ScanCallback = void (*)(chip::DeviceLayer::NetworkCommissioning::WiFiScanResponse *);
5747

5848
typedef struct wfx_wifi_scan_ext
5949
{
@@ -244,14 +234,14 @@ class WifiInterface : public WifiStateProvider, public PowerSaveInterface
244234

245235
/**
246236
* @brief Gets the connected access point information.
247-
* See @wfx_wifi_scan_result_t for the information that is returned by the function.
237+
* See @NetworkCommissioning::WiFiScanResponse for the information that is returned by the function.
248238
*
249239
* @param[out] info AP information
250240
*
251241
* @return CHIP_ERROR CHIP_NO_ERROR, device has succesfully pulled all the AP information
252242
* CHIP_ERROR_INTERNAL, otherwise. If the function returns an error, the data in ap cannot be used.
253243
*/
254-
virtual CHIP_ERROR GetAccessPointInfo(wfx_wifi_scan_result_t & info) = 0;
244+
virtual CHIP_ERROR GetAccessPointInfo(chip::DeviceLayer::NetworkCommissioning::WiFiScanResponse & info) = 0;
255245

256246
/**
257247
* @brief Gets the connected access point extended information.

0 commit comments

Comments
 (0)