Skip to content

Commit a6e6355

Browse files
[Silabs] [WiFi] Removing the IP polling from the siwx917 and adding only for rs9116 (project-chip#37782)
* Using the lwip file from wifi sdk and moving dhcp only for rs9116 * addressing review comments * restyling the PR * renaming the API name * adding the comment for the TA retries * addressing review comments * Update src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * restyling the PR * fixing the build errors * updating the path and submodule --------- Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com>
1 parent 80a647c commit a6e6355

File tree

9 files changed

+101
-138
lines changed

9 files changed

+101
-138
lines changed

src/platform/silabs/wifi/BUILD.gn

+1-3
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,7 @@ source_set("wifi-platform") {
135135
"${silabs_platform_dir}/wifi/SiWx/WifiInterfaceImpl.h",
136136
"${silabs_platform_dir}/wifi/wiseconnect-interface/WiseconnectWifiInterface.cpp",
137137
"${silabs_platform_dir}/wifi/wiseconnect-interface/WiseconnectWifiInterface.h",
138-
139-
# Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed
140-
"${matter_support_root}/sdk-copies/components/service/network_manager/src/sl_net_for_lwip.c",
138+
"${wifi_sdk_root}/components/service/network_manager/src/sl_net_for_lwip.c",
141139
]
142140

143141
public_deps += [ "${lwip_root}:lwip" ]

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

+19-53
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,10 @@ sl_status_t SetWifiConfigurations()
372372
VerifyOrReturnError(status == SL_STATUS_OK, status,
373373
ChipLogError(DeviceLayer, "sl_wifi_set_listen_interval failed: 0x%lx", status));
374374

375-
sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
375+
// This is be triggered on the disconnect use case, providing the amount of TA tries
376+
// Setting the TA retry to 1 and giving the control to the M4 for improved power efficiency
377+
// When max_retry_attempts is set to 0, TA will retry indefinitely.
378+
sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 1 };
376379
status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
377380
VerifyOrReturnError(status == SL_STATUS_OK, status,
378381
ChipLogError(DeviceLayer, "sl_wifi_set_advanced_client_configuration failed: 0x%lx", status));
@@ -490,10 +493,6 @@ CHIP_ERROR WifiInterfaceImpl::InitWiFiStack(void)
490493
sWifiEventQueue = osMessageQueueNew(kWfxQueueSize, sizeof(WiseconnectWifiInterface::WifiPlatformEvent), nullptr);
491494
VerifyOrReturnError(sWifiEventQueue != nullptr, CHIP_ERROR_NO_MEMORY);
492495

493-
status = CreateDHCPTimer();
494-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_NO_MEMORY,
495-
ChipLogError(DeviceLayer, "CreateDHCPTimer failed: %lx", status));
496-
497496
return CHIP_NO_ERROR;
498497
}
499498

@@ -504,7 +503,7 @@ void WifiInterfaceImpl::ProcessEvent(WiseconnectWifiInterface::WifiPlatformEvent
504503
case WiseconnectWifiInterface::WifiPlatformEvent::kStationConnect:
505504
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kStationConnect");
506505
wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnected);
507-
ResetDHCPNotificationFlags();
506+
ResetConnectivityNotificationFlags();
508507
break;
509508

510509
case WiseconnectWifiInterface::WifiPlatformEvent::kStationDisconnect: {
@@ -513,11 +512,10 @@ void WifiInterfaceImpl::ProcessEvent(WiseconnectWifiInterface::WifiPlatformEvent
513512

514513
wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationReady)
515514
.Clear(WifiInterface::WifiState::kStationConnecting)
516-
.Clear(WifiInterface::WifiState::kStationConnected)
517-
.Clear(WifiInterface::WifiState::kStationDhcpDone);
515+
.Clear(WifiInterface::WifiState::kStationConnected);
518516

519517
// TODO: Implement disconnect notify
520-
ResetDHCPNotificationFlags();
518+
ResetConnectivityNotificationFlags();
521519
#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
522520
NotifyIPv4Change(false);
523521
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
@@ -595,61 +593,29 @@ void WifiInterfaceImpl::ProcessEvent(WiseconnectWifiInterface::WifiPlatformEvent
595593
JoinWifiNetwork();
596594
break;
597595

598-
case WiseconnectWifiInterface::WifiPlatformEvent::kStationDoDhcp:
599-
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kStationDoDhcp");
600-
StartDHCPTimer(kDhcpPollIntervalMs);
601-
break;
602-
603-
case WiseconnectWifiInterface::WifiPlatformEvent::kStationDhcpDone:
604-
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kStationDhcpDone");
605-
CancelDHCPTimer();
606-
break;
607-
608-
case WiseconnectWifiInterface::WifiPlatformEvent::kStationDhcpPoll:
609-
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kStationDhcpPoll");
610-
HandleDHCPPolling();
611-
break;
596+
case WiseconnectWifiInterface::WifiPlatformEvent::kConnectionComplete:
597+
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kConnectionComplete");
598+
NotifySuccessfulConnection();
612599

613600
default:
614601
break;
615602
}
616603
}
617604

618-
void WifiInterfaceImpl::HandleDHCPPolling(void)
605+
void WifiInterfaceImpl::NotifySuccessfulConnection(void)
619606
{
620-
WiseconnectWifiInterface::WifiPlatformEvent event;
621-
622-
// TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state
623607
struct netif * sta_netif = &wifi_client_context.netif;
624-
VerifyOrReturn(sta_netif != nullptr, ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif"));
608+
VerifyOrReturn(sta_netif != nullptr, ChipLogError(DeviceLayer, "NotifySuccessfulConnection: failed to get STA netif"));
625609

626610
#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
627-
uint8_t dhcp_state = dhcpclient_poll(sta_netif);
628-
if (dhcp_state == DHCP_ADDRESS_ASSIGNED && !mHasNotifiedIPv4)
629-
{
630-
GotIPv4Address((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
631-
event = WiseconnectWifiInterface::WifiPlatformEvent::kStationDhcpDone;
632-
WiseconnectWifiInterface::PostWifiPlatformEvent(event);
633-
NotifyConnectivity();
634-
}
635-
else if (dhcp_state == DHCP_OFF)
636-
{
637-
NotifyIPv4Change(false);
638-
}
611+
GotIPv4Address((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
639612
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
640-
/* Checks if the assigned IPv6 address is preferred by evaluating
641-
* the first block of IPv6 address ( block 0)
642-
*/
643-
if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !mHasNotifiedIPv6)
644-
{
645-
char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
646-
VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != nullptr);
647-
ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
648-
NotifyIPv6Change(true);
649-
event = WiseconnectWifiInterface::WifiPlatformEvent::kStationDhcpDone;
650-
PostWifiPlatformEvent(event);
651-
NotifyConnectivity();
652-
}
613+
614+
char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
615+
VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != nullptr);
616+
ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
617+
NotifyIPv6Change(true);
618+
NotifyConnectivity();
653619
}
654620

655621
sl_status_t WifiInterfaceImpl::JoinWifiNetwork(void)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ class WifiInterfaceImpl final : public WiseconnectWifiInterface
9797
sl_status_t JoinWifiNetwork();
9898

9999
/**
100-
* @brief Processing function responsible of executing the DHCP polling operation until we have an IPv6 or IPv4 address
100+
* @brief Processing function responsible for notifying the upper layers of a succesful connection attempt.
101101
*
102102
*/
103-
void HandleDHCPPolling();
103+
void NotifySuccessfulConnection();
104104

105105
static WifiInterfaceImpl mInstance;
106106
};

src/platform/silabs/wifi/SiWx/ncp/rs9117.gni

+1-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ rs9117_src_sapi = [
4343
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/spi/sl_si91x_spi.c",
4444
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/sl_si91x_ncp_driver.c",
4545

46-
# Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed
47-
"${matter_support_root}/sdk-copies/components/service/network_manager/src/sl_net_for_lwip.c",
48-
4946
# wifi component
5047
"${wifi_sdk_root}/components/protocol/wifi/src/sl_wifi_basic_credentials.c",
5148
"${wifi_sdk_root}/components/protocol/wifi/src/sl_wifi_callback_framework.c",
@@ -54,6 +51,7 @@ rs9117_src_sapi = [
5451
# basic_network_manager component
5552
"${wifi_sdk_root}/components/service/network_manager/src/sl_net_credentials.c",
5653
"${wifi_sdk_root}/components/service/network_manager/src/sl_net_basic_profiles.c",
54+
"${wifi_sdk_root}/components/service/network_manager/src/sl_net_for_lwip.c",
5755

5856
# si91x_basic_buffers component
5957
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/memory/malloc_buffers.c",

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

+36-3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ osThreadAttr_t kDrvTaskAttr = { .name = "drv_rsi",
7272

7373
osMessageQueueId_t sWifiEventQueue = NULL;
7474

75+
// DHCP Polling interval for the IPv4/IPv6
76+
constexpr uint32_t kDhcpPollIntervalMs = 250;
77+
7578
uint8_t wfx_rsi_drv_buf[WFX_RSI_BUF_SZ];
7679
wfx_wifi_scan_ext_t temp_reset;
7780

@@ -314,7 +317,7 @@ void WifiInterfaceImpl::ProcessEvent(WifiPlatformEvent event)
314317
case WiseconnectWifiInterface::WifiPlatformEvent::kStationConnect: {
315318
ChipLogDetail(DeviceLayer, "WiseconnectWifiInterface::WifiPlatformEvent::kStationConnect");
316319
wfx_rsi.dev_state.Set(WifiInterface::WifiState::kStationConnected);
317-
ResetDHCPNotificationFlags();
320+
ResetConnectivityNotificationFlags();
318321
chip::DeviceLayer::Silabs::Lwip::SetLwipStationLinkUp();
319322
}
320323
break;
@@ -327,7 +330,7 @@ void WifiInterfaceImpl::ProcessEvent(WifiPlatformEvent event)
327330
.Clear(WifiInterface::WifiState::kStationDhcpDone);
328331

329332
/* TODO: Implement disconnect notify */
330-
ResetDHCPNotificationFlags();
333+
ResetConnectivityNotificationFlags();
331334
chip::DeviceLayer::Silabs::Lwip::SetLwipStationLinkDown();
332335

333336
#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
@@ -404,7 +407,7 @@ void WifiInterfaceImpl::ProcessEvent(WifiPlatformEvent event)
404407
JoinWifiNetwork();
405408
}
406409
break;
407-
case WiseconnectWifiInterface::WifiPlatformEvent::kStationDoDhcp: {
410+
case WiseconnectWifiInterface::WifiPlatformEvent::kConnectionComplete: {
408411
StartDHCPTimer(kDhcpPollIntervalMs);
409412
}
410413
break;
@@ -606,6 +609,36 @@ void WifiInterfaceImpl::JoinWifiNetwork(void)
606609
}
607610
}
608611

612+
void WifiInterfaceImpl::DHCPTimerEventHandler(void * arg)
613+
{
614+
WifiPlatformEvent event = WiseconnectWifiInterface::WifiPlatformEvent::kStationDhcpPoll;
615+
WifiInterfaceImpl::GetInstance().PostWifiPlatformEvent(event);
616+
}
617+
618+
void WifiInterfaceImpl::CancelDHCPTimer(void)
619+
{
620+
VerifyOrReturn(osTimerIsRunning(mDHCPTimer), ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running"));
621+
VerifyOrReturn(osTimerStop(mDHCPTimer) == osOK, ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer"));
622+
}
623+
624+
void WifiInterfaceImpl::StartDHCPTimer(uint32_t timeout)
625+
{
626+
// Cancel timer if already started
627+
CancelDHCPTimer();
628+
629+
VerifyOrReturn(osTimerStart(mDHCPTimer, pdMS_TO_TICKS(timeout)) == osOK,
630+
ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer"));
631+
}
632+
633+
sl_status_t WifiInterfaceImpl::CreateDHCPTimer()
634+
{
635+
// TODO: Use LWIP timer instead of creating a new one here
636+
mDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, nullptr, nullptr);
637+
VerifyOrReturnError(mDHCPTimer != nullptr, SL_STATUS_ALLOCATION_FAILED);
638+
639+
return SL_STATUS_OK;
640+
}
641+
609642
void WifiInterfaceImpl::HandleDHCPPolling(void)
610643
{
611644
struct netif * sta_netif;

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

+29
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,35 @@ class WifiInterfaceImpl final : public WiseconnectWifiInterface
103103
*/
104104
void HandleDHCPPolling();
105105

106+
/**
107+
* @brief Function cancels the DHCP timer if it is running.
108+
* If the timer isn't running, function doesn't do anything.
109+
*/
110+
void CancelDHCPTimer();
111+
112+
/**
113+
* @brief Function starts the DHCP timer with the given timeout.
114+
*
115+
* TODO: change input to milliseconds type
116+
*
117+
* @param timeout timer duration in milliseconds
118+
*/
119+
void StartDHCPTimer(uint32_t timeout);
120+
121+
/**
122+
* @brief Function creates the DHCP timer
123+
*
124+
*
125+
* @return sl_status_t SL_STATUS_OK, the timer was successfully created
126+
*/
127+
sl_status_t CreateDHCPTimer();
128+
129+
/**
130+
* @brief Callback function for the DHCP timer event.
131+
*/
132+
static void DHCPTimerEventHandler(void * arg);
133+
134+
osTimerId_t mDHCPTimer;
106135
static WifiInterfaceImpl mInstance;
107136
};
108137

src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.cpp

+2-32
Original file line numberDiff line numberDiff line change
@@ -128,27 +128,6 @@ CHIP_ERROR WiseconnectWifiInterface::TriggerDisconnection()
128128
return CHIP_NO_ERROR;
129129
}
130130

131-
void WiseconnectWifiInterface::DHCPTimerEventHandler(void * arg)
132-
{
133-
WifiPlatformEvent event = WifiPlatformEvent::kStationDhcpPoll;
134-
WiseconnectWifiInterface::GetInstance().PostWifiPlatformEvent(event);
135-
}
136-
137-
void WiseconnectWifiInterface::CancelDHCPTimer(void)
138-
{
139-
VerifyOrReturn(osTimerIsRunning(mDHCPTimer), ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running"));
140-
VerifyOrReturn(osTimerStop(mDHCPTimer) == osOK, ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer"));
141-
}
142-
143-
void WiseconnectWifiInterface::StartDHCPTimer(uint32_t timeout)
144-
{
145-
// Cancel timer if already started
146-
CancelDHCPTimer();
147-
148-
VerifyOrReturn(osTimerStart(mDHCPTimer, pdMS_TO_TICKS(timeout)) == osOK,
149-
ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer"));
150-
}
151-
152131
void WiseconnectWifiInterface::NotifyConnectivity(void)
153132
{
154133
VerifyOrReturn(!mHasNotifiedWifiConnectivity);
@@ -157,22 +136,13 @@ void WiseconnectWifiInterface::NotifyConnectivity(void)
157136
mHasNotifiedWifiConnectivity = true;
158137
}
159138

160-
sl_status_t WiseconnectWifiInterface::CreateDHCPTimer()
161-
{
162-
// TODO: Use LWIP timer instead of creating a new one here
163-
mDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, nullptr, nullptr);
164-
VerifyOrReturnError(mDHCPTimer != nullptr, SL_STATUS_ALLOCATION_FAILED);
165-
166-
return SL_STATUS_OK;
167-
}
168-
169-
void WiseconnectWifiInterface::ResetDHCPNotificationFlags(void)
139+
void WiseconnectWifiInterface::ResetConnectivityNotificationFlags(void)
170140
{
171141

172142
ResetIPNotificationStates();
173143
mHasNotifiedWifiConnectivity = false;
174144

175-
WifiPlatformEvent event = WifiPlatformEvent::kStationDoDhcp;
145+
WifiPlatformEvent event = WifiPlatformEvent::kConnectionComplete;
176146
PostWifiPlatformEvent(event);
177147
}
178148

0 commit comments

Comments
 (0)