Skip to content

Commit 13da787

Browse files
[Silabs] Implement the WifiInterface class structure for all Wi-Fi platforms (#37810)
* Refactor structure for the SiWx platform * Fix compilation errors for WifiInterface * Update WifiInterface consummers * Wf200 transition to the WifiInterface class structure * Implement rs9116 wifi interface * Fix wf200 init * Fix 917 NCP * Clean up * Fix builds * Update src/platform/silabs/NetworkCommissioningWiFiDriver.cpp Co-authored-by: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com> * Add error code to log --------- Co-authored-by: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com>
1 parent 1612d52 commit 13da787

23 files changed

+1985
-1603
lines changed

examples/platform/silabs/BaseApplication.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ CHIP_ERROR BaseApplication::Init()
272272
* Wait for the WiFi to be initialized
273273
*/
274274
ChipLogProgress(AppServer, "APP: Wait WiFi Init");
275-
while (!IsStationReady())
275+
while (!WifiInterface::GetInstance().IsStationReady())
276276
{
277277
osDelay(pdMS_TO_TICKS(10));
278278
}

examples/platform/silabs/MatterConfig.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName)
318318
#ifdef SL_WIFI
319319
CHIP_ERROR SilabsMatterConfig::InitWiFi(void)
320320
{
321-
return InitWiFiStack();
321+
return WifiInterface::GetInstance().InitWiFiStack();
322322
}
323323
#endif // SL_WIFI
324324

src/platform/silabs/ConfigurationManagerImpl.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ namespace chip {
3838
namespace DeviceLayer {
3939

4040
using namespace ::chip::DeviceLayer::Internal;
41+
using namespace ::chip ::DeviceLayer ::Silabs;
4142

4243
ConfigurationManagerImpl & ConfigurationManagerImpl::GetDefaultInstance()
4344
{
@@ -290,14 +291,14 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg)
290291
PersistedStorage::KeyValueStoreMgrImpl().ErasePartition();
291292

292293
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
293-
error = TriggerDisconnection();
294+
error = WifiInterface::GetInstance().TriggerDisconnection();
294295
if (error != CHIP_NO_ERROR)
295296
{
296297
ChipLogError(DeviceLayer, "TriggerDisconnection() failed: %s", chip::ErrorStr(error));
297298
}
298299

299300
ChipLogProgress(DeviceLayer, "Clearing WiFi provision");
300-
ClearWifiCredentials();
301+
WifiInterface::GetInstance().ClearWifiCredentials();
301302
#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
302303

303304
// Restart the system.
@@ -317,7 +318,7 @@ CHIP_ERROR ConfigurationManagerImpl::GetPrimaryWiFiMACAddress(uint8_t * buf)
317318
VerifyOrReturnError(buf != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
318319

319320
MutableByteSpan byteSpan(buf, kPrimaryMACAddressLength);
320-
return GetMacAddress(SL_WFX_STA_INTERFACE, byteSpan);
321+
return WifiInterface::GetInstance().GetMacAddress(SL_WFX_STA_INTERFACE, byteSpan);
321322
}
322323
#endif
323324

src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp

+20-18
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ using namespace ::chip;
4646
using namespace ::chip::Inet;
4747
using namespace ::chip::System;
4848
using namespace ::chip::DeviceLayer::Internal;
49+
using namespace ::chip::DeviceLayer::Silabs;
4950

5051
namespace chip {
5152
namespace DeviceLayer {
@@ -65,7 +66,7 @@ CHIP_ERROR ConnectivityManagerImpl::_Init()
6566
// TODO Initialize the Chip Addressing and Routing Module.
6667

6768
// Ensure that station mode is enabled.
68-
ConfigureStationMode();
69+
WifiInterface::GetInstance().ConfigureStationMode();
6970

7071
err = DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL);
7172

@@ -84,11 +85,11 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
8485

8586
switch (event->Platform.WFXSystemEvent.data.genericMsgEvent.header.id)
8687
{
87-
case to_underlying(WifiEvent::kStartUp):
88+
case to_underlying(WifiInterface::WifiEvent::kStartUp):
8889
ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_START");
8990
DriveStationState();
9091
break;
91-
case to_underlying(WifiEvent::kConnect):
92+
case to_underlying(WifiInterface::WifiEvent::kConnect):
9293
ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_CONNECTED");
9394
if (mWiFiStationState == kWiFiStationState_Connecting)
9495
{
@@ -103,7 +104,7 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
103104
}
104105
DriveStationState();
105106
break;
106-
case to_underlying(WifiEvent::kDisconnect):
107+
case to_underlying(WifiInterface::WifiEvent::kDisconnect):
107108
ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_DISCONNECTED");
108109
if (mWiFiStationState == kWiFiStationState_Connecting)
109110
{
@@ -112,9 +113,9 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
112113
DriveStationState();
113114
break;
114115

115-
case to_underlying(WifiEvent::kGotIPv4):
116-
case to_underlying(WifiEvent::kLostIP):
117-
case to_underlying(WifiEvent::kGotIPv6):
116+
case to_underlying(WifiInterface::WifiEvent::kGotIPv4):
117+
case to_underlying(WifiInterface::WifiEvent::kLostIP):
118+
case to_underlying(WifiInterface::WifiEvent::kGotIPv6):
118119
ChipLogProgress(DeviceLayer, "IP Change Event");
119120
UpdateInternetConnectivityState();
120121
break;
@@ -128,7 +129,7 @@ ConnectivityManager::WiFiStationMode ConnectivityManagerImpl::_GetWiFiStationMod
128129
{
129130
if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled)
130131
{
131-
if (IsStationModeEnabled())
132+
if (WifiInterface::GetInstance().IsStationModeEnabled())
132133
{
133134
mWiFiStationMode = kWiFiStationMode_Enabled;
134135
}
@@ -143,12 +144,12 @@ ConnectivityManager::WiFiStationMode ConnectivityManagerImpl::_GetWiFiStationMod
143144

144145
bool ConnectivityManagerImpl::_IsWiFiStationProvisioned(void)
145146
{
146-
return IsWifiProvisioned();
147+
return WifiInterface::GetInstance().IsWifiProvisioned();
147148
}
148149

149150
bool ConnectivityManagerImpl::_IsWiFiStationEnabled(void)
150151
{
151-
return IsStationModeEnabled();
152+
return WifiInterface::GetInstance().IsStationModeEnabled();
152153
}
153154

154155
CHIP_ERROR ConnectivityManagerImpl::_SetWiFiStationMode(ConnectivityManager::WiFiStationMode val)
@@ -176,7 +177,7 @@ void ConnectivityManagerImpl::_ClearWiFiStationProvision(void)
176177
{
177178
if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled)
178179
{
179-
ClearWifiCredentials();
180+
WifiInterface::GetInstance().ClearWifiCredentials();
180181

181182
DeviceLayer::SystemLayer().ScheduleWork(DriveStationState, NULL);
182183
}
@@ -222,14 +223,14 @@ void ConnectivityManagerImpl::DriveStationState()
222223
if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled)
223224
{
224225
// Ensure that the Wifi task is started.
225-
CHIP_ERROR error = StartWifiTask();
226+
CHIP_ERROR error = WifiInterface::GetInstance().StartWifiTask();
226227
VerifyOrReturn(error == CHIP_NO_ERROR, ChipLogError(DeviceLayer, "StartWifiTask() failed: %s", ErrorStr(error)));
227228

228229
// Ensure that station mode is enabled in the WiFi layer.
229-
ConfigureStationMode();
230+
WifiInterface::GetInstance().ConfigureStationMode();
230231
}
231232

232-
stationConnected = IsStationConnected();
233+
stationConnected = WifiInterface::GetInstance().IsStationConnected();
233234

234235
// If the station interface is currently connected ...
235236
if (stationConnected)
@@ -255,7 +256,7 @@ void ConnectivityManagerImpl::DriveStationState()
255256
{
256257
ChipLogProgress(DeviceLayer, "Disconnecting WiFi station interface");
257258

258-
CHIP_ERROR error = TriggerDisconnection();
259+
CHIP_ERROR error = WifiInterface::GetInstance().TriggerDisconnection();
259260
SuccessOrExitAction(error, ChipLogError(DeviceLayer, "TriggerDisconnection() failed: %s", ErrorStr(error)));
260261

261262
ChangeWiFiStationState(kWiFiStationState_Disconnecting);
@@ -299,7 +300,8 @@ void ConnectivityManagerImpl::DriveStationState()
299300
if (mWiFiStationState != kWiFiStationState_Connecting)
300301
{
301302
ChipLogProgress(DeviceLayer, "Attempting to connect WiFi");
302-
SuccessOrExitAction(ConnectToAccessPoint(), ChipLogError(DeviceLayer, "ConnectToAccessPoint() failed"));
303+
SuccessOrExitAction(WifiInterface::GetInstance().ConnectToAccessPoint(),
304+
ChipLogError(DeviceLayer, "ConnectToAccessPoint() failed"));
303305

304306
ChangeWiFiStationState(kWiFiStationState_Connecting);
305307
}
@@ -376,9 +378,9 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void)
376378
if (mWiFiStationState == kWiFiStationState_Connected)
377379
{
378380
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
379-
haveIPv4Conn = HasAnIPv4Address();
381+
haveIPv4Conn = WifiInterface::GetIstance().HasAnIPv4Address();
380382
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
381-
haveIPv6Conn = HasAnIPv6Address();
383+
haveIPv6Conn = WifiInterface::GetInstance().HasAnIPv6Address();
382384
}
383385

384386
// If the internet connectivity state has changed...

src/platform/silabs/DiagnosticDataProviderImpl.cpp

+12-12
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBssId(MutableByteSpan & BssId)
340340

341341
VerifyOrReturnError(BssId.size() >= bssIdSize, CHIP_ERROR_BUFFER_TOO_SMALL);
342342

343-
if (GetAccessPointInfo(ap) == CHIP_NO_ERROR)
343+
if (Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap) == CHIP_NO_ERROR)
344344
{
345345
memcpy(BssId.data(), ap.bssid, bssIdSize);
346346
BssId.reduce_size(bssIdSize);
@@ -355,7 +355,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiSecurityType(app::Clusters::WiFiNe
355355
using app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum;
356356

357357
wfx_wifi_scan_result_t ap = { 0 };
358-
CHIP_ERROR error = GetAccessPointInfo(ap);
358+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
359359
if (error == CHIP_NO_ERROR)
360360
{
361361
// TODO: Is this actually right? Do the wfx_wifi_scan_result_t values
@@ -375,7 +375,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiVersion(app::Clusters::WiFiNetwork
375375
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiChannelNumber(uint16_t & channelNumber)
376376
{
377377
wfx_wifi_scan_result_t ap = { 0 };
378-
CHIP_ERROR error = GetAccessPointInfo(ap);
378+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
379379
if (error == CHIP_NO_ERROR)
380380
{
381381
channelNumber = ap.chan;
@@ -387,7 +387,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiChannelNumber(uint16_t & channelNu
387387
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiRssi(int8_t & rssi)
388388
{
389389
wfx_wifi_scan_result_t ap = { 0 };
390-
CHIP_ERROR error = GetAccessPointInfo(ap);
390+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointInfo(ap);
391391
if (error == CHIP_NO_ERROR)
392392
{
393393
rssi = ap.rssi;
@@ -399,7 +399,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiRssi(int8_t & rssi)
399399
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBeaconLostCount(uint32_t & beaconLostCount)
400400
{
401401
wfx_wifi_scan_ext_t extra_info = { 0 };
402-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
402+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
403403
if (error == CHIP_NO_ERROR)
404404
{
405405
beaconLostCount = extra_info.beacon_lost_count;
@@ -416,7 +416,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiCurrentMaxRate(uint64_t & currentM
416416
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketMulticastRxCount(uint32_t & packetMulticastRxCount)
417417
{
418418
wfx_wifi_scan_ext_t extra_info = { 0 };
419-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
419+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
420420
if (error == CHIP_NO_ERROR)
421421
{
422422
packetMulticastRxCount = extra_info.mcast_rx_count;
@@ -428,7 +428,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketMulticastRxCount(uint32_t &
428428
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketMulticastTxCount(uint32_t & packetMulticastTxCount)
429429
{
430430
wfx_wifi_scan_ext_t extra_info = { 0 };
431-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
431+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
432432
if (error == CHIP_NO_ERROR)
433433
{
434434
packetMulticastTxCount = extra_info.mcast_tx_count;
@@ -440,7 +440,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketMulticastTxCount(uint32_t &
440440
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketUnicastRxCount(uint32_t & packetUnicastRxCount)
441441
{
442442
wfx_wifi_scan_ext_t extra_info = { 0 };
443-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
443+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
444444
if (error == CHIP_NO_ERROR)
445445
{
446446
packetUnicastRxCount = extra_info.ucast_rx_count;
@@ -452,7 +452,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketUnicastRxCount(uint32_t & pa
452452
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketUnicastTxCount(uint32_t & packetUnicastTxCount)
453453
{
454454
wfx_wifi_scan_ext_t extra_info = { 0 };
455-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
455+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
456456
if (error == CHIP_NO_ERROR)
457457
{
458458
packetUnicastTxCount = extra_info.ucast_tx_count;
@@ -464,7 +464,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiPacketUnicastTxCount(uint32_t & pa
464464
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiOverrunCount(uint64_t & overrunCount)
465465
{
466466
wfx_wifi_scan_ext_t extra_info = { 0 };
467-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
467+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
468468
if (error == CHIP_NO_ERROR)
469469
{
470470
overrunCount = extra_info.overrun_count;
@@ -476,7 +476,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiOverrunCount(uint64_t & overrunCou
476476
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBeaconRxCount(uint32_t & beaconRxCount)
477477
{
478478
wfx_wifi_scan_ext_t extra_info = { 0 };
479-
CHIP_ERROR error = GetAccessPointExtendedInfo(extra_info);
479+
CHIP_ERROR error = Silabs::WifiInterface::GetInstance().GetAccessPointExtendedInfo(extra_info);
480480
if (error == CHIP_NO_ERROR)
481481
{
482482
beaconRxCount = extra_info.beacon_rx_count;
@@ -487,7 +487,7 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBeaconRxCount(uint32_t & beaconRxC
487487

488488
CHIP_ERROR DiagnosticDataProviderImpl::ResetWiFiNetworkDiagnosticsCounts()
489489
{
490-
return ResetCounters();
490+
return Silabs::WifiInterface::GetInstance().ResetCounters();
491491
}
492492
#endif // SL_WIFI
493493

src/platform/silabs/NetworkCommissioningWiFiDriver.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
using namespace ::chip;
2727
using namespace ::chip::DeviceLayer::Internal;
28+
using namespace ::chip::DeviceLayer::Silabs;
2829

2930
namespace chip {
3031
namespace DeviceLayer {
@@ -138,14 +139,13 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen,
138139
{
139140
if (ConnectivityMgr().IsWiFiStationProvisioned())
140141
{
141-
ChipLogProgress(DeviceLayer, "Disconecting for current wifi");
142-
ReturnErrorOnFailure(TriggerDisconnection());
142+
ChipLogProgress(DeviceLayer, "Disconnecting for current wifi");
143+
ReturnErrorOnFailure(WifiInterface::GetInstance().TriggerDisconnection());
143144
}
144145
ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled));
145146

146147
// Set the wifi configuration
147-
WifiCredentials wifiConfig;
148-
wifiConfig.Clear();
148+
WifiInterface::WifiCredentials wifiConfig;
149149

150150
VerifyOrReturnError(ssidLen <= WFX_MAX_SSID_LENGTH, CHIP_ERROR_BUFFER_TOO_SMALL);
151151
memcpy(wifiConfig.ssid, ssid, ssidLen);
@@ -159,7 +159,7 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen,
159159

160160
ChipLogProgress(NetworkProvisioning, "Setting up connection for WiFi SSID: %.*s", static_cast<int>(ssidLen), ssid);
161161
// Configure the WFX WiFi interface.
162-
SetWifiCredentials(wifiConfig);
162+
WifiInterface::GetInstance().SetWifiCredentials(wifiConfig);
163163
ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled));
164164
ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Enabled));
165165
return CHIP_NO_ERROR;
@@ -181,7 +181,7 @@ void SlWiFiDriver::UpdateNetworkingStatus()
181181
}
182182

183183
ByteSpan networkId = ByteSpan((const unsigned char *) mStagingNetwork.ssid, mStagingNetwork.ssidLen);
184-
if (!IsStationConnected())
184+
if (!WifiInterface::GetInstance().IsStationConnected())
185185
{
186186
// TODO: https://github.com/project-chip/connectedhomeip/issues/26861
187187
mpStatusChangeCallback->OnNetworkingStatusChange(Status::kUnknownError, MakeOptional(networkId),
@@ -261,7 +261,7 @@ chip::BitFlags<WiFiSecurity> SlWiFiDriver::ConvertSecuritytype(wfx_sec_t securit
261261
bool SlWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
262262
{
263263
ChipLogProgress(DeviceLayer, "Start Scan WiFi Networks");
264-
CHIP_ERROR err = StartNetworkScan(ssid, OnScanWiFiNetworkDone);
264+
CHIP_ERROR err = WifiInterface::GetInstance().StartNetworkScan(ssid, OnScanWiFiNetworkDone);
265265

266266
if (err != CHIP_NO_ERROR)
267267
{
@@ -326,13 +326,13 @@ void SlWiFiDriver::ScanNetworks(ByteSpan ssid, WiFiDriver::ScanCallback * callba
326326

327327
CHIP_ERROR GetConnectedNetwork(Network & network)
328328
{
329-
WifiCredentials wifiConfig;
329+
WifiInterface::WifiCredentials wifiConfig;
330330
network.networkIDLen = 0;
331331
network.connected = false;
332332

333333
// we are able to fetch the wifi provision data and STA should be connected
334-
VerifyOrReturnError(IsStationConnected(), CHIP_ERROR_NOT_CONNECTED);
335-
ReturnErrorOnFailure(GetWifiCredentials(wifiConfig));
334+
VerifyOrReturnError(WifiInterface::GetInstance().IsStationConnected(), CHIP_ERROR_NOT_CONNECTED);
335+
ReturnErrorOnFailure(WifiInterface::GetInstance().GetWifiCredentials(wifiConfig));
336336
VerifyOrReturnError(wifiConfig.ssidLength < NetworkCommissioning::kMaxNetworkIDLen, CHIP_ERROR_BUFFER_TOO_SMALL);
337337

338338
network.connected = true;

0 commit comments

Comments
 (0)