[Silabs] Adds fix for Wi-Fi task loop, BLE task priority, BLE indication soft timer expiry (#34095)
* Adds fix for WiFi task looping
* Adds fix for BLE task priority and indication soft timer expiry
* Adds fix for return check
* Remove unused cred and add length check
* aligned include
* Replace `lx` with `x` for all sl_status_t logging
* Refactor posting of events to the end of the codeblock
* Adds `BLE_DRIVER_TASK_PRIORITY`
* Adds static_cast for status in ChipLogging
* chore: Refactor show_scan_results function to improve readability and maintainability
* chore: Update WiFi join function to use strnlen for SSID length calculation
* chore: Update WiFi join function to use strnlen for SSID length calculation
* chore: Update BSSID array size in WiFi scan result struct
* chore: Update SLAAC OK log message to use formatted IPv6 address
* Refactor show_scan_results function for improved readability and maintainability
* Refactor show_scan_results function to fix null termination bug
* Refactor show_scan_results function to fix null termination bug
* Adds fix for NCP macros
* Revert BLE timer changes
* Fix passkey length validation in sl_wifi_if.cpp
* Refactor BLEManagerImpl::_OnPlatformEvent for improved code readability and maintainability
* Refactor BLEManagerImpl::_OnPlatformEvent for improved code readability and maintainability
* Revert "Refactor BLEManagerImpl::_OnPlatformEvent for improved code readability and maintainability"
This reverts commit 9f1b1805ed9b3ce2e9b619c12b0f93f8f16ad335.
* Added locks to avoid race conditions
* Addressed comments
* Refactor sl_wifi_if.cpp for improved code readability and maintainability
* Fix passkey length validation in sl_wifi_if.cpp
* Fix BSSID length in wfx_rsi_get_ap_info and wfx_rsi_save_ap_info
* Refactor log statement after length checks
* Adds missing replace
---------
Co-authored-by: brosahay <3526930+brosahay@users.noreply.github.com>
diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
index 5253b3b..59bf52b 100644
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
+++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
@@ -19,9 +19,10 @@
#include <stdlib.h>
#include <string.h>
-#include "silabs_utils.h"
#include "sl_status.h"
#include <app/icd/server/ICDServerConfig.h>
+#include <inet/IPAddress.h>
+#include <lib/support/logging/CHIPLogging.h>
#include "FreeRTOS.h"
#include "event_groups.h"
@@ -132,14 +133,14 @@
// Check if timer started
if (!osTimerIsRunning(sDHCPTimer))
{
- SILABS_LOG("CancelDHCPTimer: timer not running");
+ ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running");
return;
}
status = osTimerStop(sDHCPTimer);
if (status != osOK)
{
- SILABS_LOG("CancelDHCPTimer: failed to stop timer with status: %d", status);
+ ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer: %d", status);
}
}
@@ -153,7 +154,7 @@
status = osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout));
if (status != osOK)
{
- SILABS_LOG("StartDHCPTimer: failed to start timer with status: %d", status);
+ ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer: %d", status);
}
}
@@ -171,7 +172,7 @@
int32_t rssi = 0;
ap->security = wfx_rsi.sec.security;
ap->chan = wfx_rsi.ap_chan;
- memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &rssi);
ap->rssi = rssi;
return status;
@@ -246,7 +247,7 @@
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
{
callback_status = *(sl_status_t *) result;
- SILABS_LOG("join_callback_handler: failed: 0x%X", callback_status);
+ ChipLogError(DeviceLayer, "join_callback_handler: failed: 0x%lx", static_cast<uint32_t>(callback_status));
wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTED);
wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries++);
if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN)
@@ -259,8 +260,8 @@
/*
* Join was complete - Do the DHCP
*/
- memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
- SILABS_LOG("join_callback_handler: success");
+ ChipLogDetail(DeviceLayer, "join_callback_handler: success");
+ memset(&temp_reset, 0, sizeof(temp_reset));
WfxEvent.eventType = WFX_EVT_STA_CONN;
WfxPostEvent(&WfxEvent);
@@ -329,14 +330,14 @@
status = rsi_bt_power_save_profile(sl_si91x_ble_state, 0);
if (status != RSI_SUCCESS)
{
- SILABS_LOG("BT Powersave Config Failed, Error Code : 0x%lX", status);
+ ChipLogError(DeviceLayer, "rsi_bt_power_save_profile failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
sl_wifi_performance_profile_t wifi_profile = { .profile = sl_si91x_wifi_state };
status = sl_wifi_set_performance_profile(&wifi_profile);
if (status != RSI_SUCCESS)
{
- SILABS_LOG("Powersave Config Failed, Error Code : 0x%lX", status);
+ ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
if (sl_si91x_wifi_state == HIGH_PERFORMANCE)
@@ -361,34 +362,23 @@
*****************************************************************************************/
int32_t wfx_wifi_rsi_init(void)
{
- SILABS_LOG("wfx_wifi_rsi_init started");
+ ChipLogDetail(DeviceLayer, "wfx_wifi_rsi_init started");
sl_status_t status;
status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler);
- if (status != SL_STATUS_OK)
- {
- return status;
- }
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
// Create Sempaphore for scan
sScanSemaphore = osSemaphoreNew(1, 0, NULL);
- if (sScanSemaphore == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sScanSemaphore != NULL, SL_STATUS_ALLOCATION_FAILED);
+
// Create the message queue
sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL);
- if (sWifiEventQueue == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sWifiEventQueue != NULL, SL_STATUS_ALLOCATION_FAILED);
// Create timer for DHCP polling
// TODO: Use LWIP timer instead of creating a new one here
sDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, NULL, NULL);
- if (sDHCPTimer == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sDHCPTimer != NULL, SL_STATUS_ALLOCATION_FAILED);
return status;
}
@@ -403,9 +393,9 @@
*****************************************************************************************/
static void sl_print_firmware_version(sl_wifi_firmware_version_t * firmware_version)
{
- SILABS_LOG("Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", firmware_version->chip_id, firmware_version->rom_id,
- firmware_version->major, firmware_version->minor, firmware_version->security_version, firmware_version->patch_num,
- firmware_version->customer_id, firmware_version->build_num);
+ ChipLogDetail(DeviceLayer, "Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", firmware_version->chip_id, firmware_version->rom_id,
+ firmware_version->major, firmware_version->minor, firmware_version->security_version, firmware_version->patch_num,
+ firmware_version->customer_id, firmware_version->build_num);
}
/*************************************************************************************
@@ -424,7 +414,7 @@
status = wfx_wifi_rsi_init();
if (status != SL_STATUS_OK)
{
- SILABS_LOG("wfx_rsi_init failed %x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_init failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
#else // For SoC
@@ -433,7 +423,7 @@
status = sl_si91x_m4_ta_secure_handshake(SL_SI91X_ENABLE_XTAL, 1, &xtal_enable, 0, NULL);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("Failed to bring m4_ta_secure_handshake: 0x%lx\r\n", status);
+ ChipLogError(DeviceLayer, "sl_si91x_m4_ta_secure_handshake failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
@@ -443,8 +433,7 @@
status = sl_wifi_get_firmware_version(&version);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("Get fw version failed:");
- sl_print_firmware_version(&version);
+ ChipLogError(DeviceLayer, "sl_wifi_get_firmware_version failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
sl_print_firmware_version(&version);
@@ -452,7 +441,7 @@
status = sl_wifi_get_mac_address(SL_WIFI_CLIENT_INTERFACE, (sl_mac_address_t *) &wfx_rsi.sta_mac.octet[0]);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("sl_wifi_get_mac_address failed: %x", status);
+ ChipLogDetail(DeviceLayer, "sl_wifi_get_mac_address failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
@@ -463,7 +452,7 @@
status = sl_si91x_trng_entropy();
if (status != SL_STATUS_OK)
{
- SILABS_LOG("TRNG Entropy Failed");
+ ChipLogError(DeviceLayer, "sl_si91x_trng_entropy failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
@@ -471,7 +460,7 @@
status = sl_si91x_trng_program_key((uint32_t *) trngKey, TRNG_KEY_SIZE);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("TRNG Key Programming Failed");
+ ChipLogError(DeviceLayer, "sl_si91x_trng_program_key failed: 0x%lx", static_cast<uint32_t>(status));
return status;
}
#endif // SL_MBEDTLS_USE_TINYCRYPT
@@ -492,7 +481,7 @@
*****************************************************************************************/
void wfx_show_err(char * msg)
{
- SILABS_LOG("wfx_show_err: message: %d", msg);
+ ChipLogError(DeviceLayer, "wfx_show_err: message: %s", msg);
}
sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * scan_result, uint32_t result_length, void * arg)
@@ -500,12 +489,12 @@
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
{
callback_status = *(sl_status_t *) scan_result;
- SILABS_LOG("scan_callback_handler: failed: 0x%X", callback_status);
+ ChipLogError(DeviceLayer, "scan_callback_handler: failed: 0x%lx", static_cast<uint32_t>(callback_status));
scan_results_complete = true;
#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
wfx_rsi.sec.security = WFX_SEC_WPA3;
#else
- wfx_rsi.sec.security = WFX_SEC_WPA2;
+ wfx_rsi.sec.security = WFX_SEC_WPA2;
#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
osSemaphoreRelease(sScanSemaphore);
@@ -513,7 +502,7 @@
}
wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
wfx_rsi.ap_chan = scan_result->scan_info[0].rf_channel;
- memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_MAX_STR_LEN);
+ memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_LEN);
switch (scan_result->scan_info[0].security_mode)
{
case SL_WIFI_OPEN:
@@ -536,7 +525,7 @@
case SL_WIFI_WPA3:
wfx_rsi.sec.security = WFX_SEC_WPA3;
#else
- wfx_rsi.sec.security = WFX_SEC_WPA2;
+ wfx_rsi.sec.security = WFX_SEC_WPA2;
#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
break;
default:
@@ -549,44 +538,48 @@
osSemaphoreRelease(sScanSemaphore);
return SL_STATUS_OK;
}
+
sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result)
{
SL_WIFI_ARGS_CHECK_NULL_POINTER(scan_result);
- int x;
- wfx_wifi_scan_result_t ap;
- for (x = 0; x < (int) scan_result->scan_count; x++)
+ VerifyOrReturnError(wfx_rsi.scan_cb != NULL, SL_STATUS_INVALID_HANDLE);
+
+ wfx_wifi_scan_result_t cur_scan_result;
+ for (int idx = 0; idx < (int) scan_result->scan_count; idx++)
{
- strcpy(&ap.ssid[0], (char *) &scan_result->scan_info[x].ssid);
- if (wfx_rsi.scan_ssid)
+ memset(&cur_scan_result, 0, sizeof(cur_scan_result));
+ strncpy(cur_scan_result.ssid, (char *) &scan_result->scan_info[idx].ssid, WFX_MAX_SSID_LENGTH);
+
+ // if user has provided ssid, then check if the current scan result ssid matches the user provided ssid
+ if (wfx_rsi.scan_ssid != NULL && strcmp(wfx_rsi.scan_ssid, cur_scan_result.ssid) != CMP_SUCCESS)
{
- SILABS_LOG("SCAN SSID: %s , ap scan: %s", wfx_rsi.scan_ssid, ap.ssid);
- if (strcmp(wfx_rsi.scan_ssid, ap.ssid) == CMP_SUCCESS)
- {
- ap.security = static_cast<wfx_sec_t>(scan_result->scan_info[x].security_mode);
- ap.rssi = (-1) * scan_result->scan_info[x].rssi_val;
- memcpy(&ap.bssid[0], &scan_result->scan_info[x].bssid[0], BSSID_MAX_STR_LEN);
- (*wfx_rsi.scan_cb)(&ap);
- break;
- }
+ continue;
}
- else
+ cur_scan_result.security = static_cast<wfx_sec_t>(scan_result->scan_info[idx].security_mode);
+ cur_scan_result.rssi = (-1) * scan_result->scan_info[idx].rssi_val;
+ memcpy(cur_scan_result.bssid, scan_result->scan_info[idx].bssid, BSSID_LEN);
+ wfx_rsi.scan_cb(&cur_scan_result);
+
+ // if user has not provided the ssid, then call the callback for each scan result
+ if (wfx_rsi.scan_ssid == NULL)
{
- ap.security = static_cast<wfx_sec_t>(scan_result->scan_info[x].security_mode);
- ap.rssi = (-1) * scan_result->scan_info[x].rssi_val;
- memcpy(&ap.bssid[0], &scan_result->scan_info[x].bssid[0], BSSID_MAX_STR_LEN);
- (*wfx_rsi.scan_cb)(&ap);
+ continue;
}
+ break;
}
+
+ // cleanup and return
wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED;
- (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) 0);
- wfx_rsi.scan_cb = (void (*)(wfx_wifi_scan_result_t *)) 0;
+ wfx_rsi.scan_cb((wfx_wifi_scan_result_t *) 0);
+ wfx_rsi.scan_cb = NULL;
if (wfx_rsi.scan_ssid)
{
vPortFree(wfx_rsi.scan_ssid);
- wfx_rsi.scan_ssid = (char *) 0;
+ wfx_rsi.scan_ssid = NULL;
}
return SL_STATUS_OK;
}
+
sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * result, uint32_t result_length, void * arg)
{
callback_status = show_scan_results(result);
@@ -605,16 +598,18 @@
static void wfx_rsi_save_ap_info() // translation
{
sl_status_t status = SL_STATUS_OK;
-#ifndef EXP_BOARD // TODO: this changes will be reverted back after the SDK team fix the scan API
+#ifndef EXP_BOARD
+ // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
sl_wifi_scan_configuration_t wifi_scan_configuration = default_wifi_scan_configuration;
#endif
sl_wifi_ssid_t ssid_arg;
- ssid_arg.length = strlen(wfx_rsi.sec.ssid);
- memcpy(ssid_arg.value, (int8_t *) &wfx_rsi.sec.ssid[0], ssid_arg.length);
+ memset(&ssid_arg, 0, sizeof(ssid_arg));
+ ssid_arg.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ strncpy((char *) &ssid_arg.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
sl_wifi_set_scan_callback(scan_callback_handler, NULL);
scan_results_complete = false;
#ifndef EXP_BOARD
- // TODO: this changes will be reverted back after the SDK team fix the scan API
+ // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, &ssid_arg, &wifi_scan_configuration);
#endif
if (SL_STATUS_IN_PROGRESS == status)
@@ -632,115 +627,81 @@
**********************************************************************************************/
static sl_status_t wfx_rsi_do_join(void)
{
+ ReturnErrorCodeIf((wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED)), SL_STATUS_IN_PROGRESS);
sl_status_t status = SL_STATUS_OK;
- sl_wifi_security_t connect_security_mode;
+ sl_wifi_client_configuration_t ap;
+ memset(&ap, 0, sizeof(ap));
WfxEvent_t event;
switch (wfx_rsi.sec.security)
{
case WFX_SEC_WEP:
- connect_security_mode = SL_WIFI_WEP;
+ ap.security = SL_WIFI_WEP;
break;
case WFX_SEC_WPA:
- connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
+ ap.security = SL_WIFI_WPA_WPA2_MIXED;
break;
case WFX_SEC_WPA2:
#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
- connect_security_mode = SL_WIFI_WPA3_TRANSITION;
+ ap.security = SL_WIFI_WPA3_TRANSITION;
break;
case WFX_SEC_WPA3:
- connect_security_mode = SL_WIFI_WPA3_TRANSITION;
+ ap.security = SL_WIFI_WPA3_TRANSITION;
#else
- connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
+ ap.security = SL_WIFI_WPA_WPA2_MIXED;
#endif // WIFI_ENABLE_SECURITY_WPA3_TRANSITION
break;
case WFX_SEC_NONE:
- connect_security_mode = SL_WIFI_OPEN;
+ ap.security = SL_WIFI_OPEN;
break;
default:
- SILABS_LOG("error: unknown security type.");
+ ChipLogError(DeviceLayer, "wfx_rsi_do_join: unknown security type.");
return status;
}
-
- if (wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED))
- {
- SILABS_LOG("%s: not joining - already in progress", __func__);
- }
- else
- {
- SILABS_LOG("%s: WLAN: connecting to %s, sec=%d", __func__, &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security);
-
- /*
- * Join the network
- */
- /* TODO - make the WFX_SECURITY_xxx - same as RSI_xxx
- * Right now it's done by hand - we need something better
- */
- wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
-
- sl_wifi_set_join_callback(join_callback_handler, NULL);
+ /*
+ * Join the network
+ */
+ wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
+ status = sl_wifi_set_join_callback(join_callback_handler, NULL);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
#if CHIP_CONFIG_ENABLE_ICD_SERVER
- // Setting the listen interval to 0 which will set it to DTIM interval
- sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
- status = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
+ // Setting the listen interval to 0 which will set it to DTIM interval
+ sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
+ status = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
- sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
- sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
+ sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
+ status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
- /* Try to connect Wifi with given Credentials
- * untill there is a success or maximum number of tries allowed
- */
+ size_t psk_length = strlen(wfx_rsi.sec.passkey);
+ VerifyOrReturnError(psk_length <= SL_WIFI_MAX_PSK_LENGTH, SL_STATUS_SI91X_INVALID_PSK_LENGTH);
+ sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID;
+ status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], psk_length);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
- /* Call rsi connect call with given ssid and password
- * And check there is a success
- */
- sl_wifi_credential_t cred;
- memset(&cred, 0, sizeof(sl_wifi_credential_t));
- cred.type = SL_WIFI_PSK_CREDENTIAL;
- memcpy(cred.psk.value, &wfx_rsi.sec.passkey[0], strlen(wfx_rsi.sec.passkey));
- sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID;
- status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], strlen(wfx_rsi.sec.passkey));
- if (SL_STATUS_OK != status)
- {
- SILABS_LOG("wfx_rsi_do_join: RSI callback register join failed with status: %02x", status);
- return status;
- }
+ uint32_t timeout_ms = 0;
+ ap.ssid.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ ap.encryption = SL_WIFI_NO_ENCRYPTION;
+ ap.credential_id = id;
+ memset(&ap.ssid.value, 0, (sizeof(ap.ssid.value) / sizeof(ap.ssid.value[0])));
+ strncpy((char *) &ap.ssid.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ ChipLogDetail(DeviceLayer, "wfx_rsi_do_join: SSID: %s, SECURITY: %d(%d)", ap.ssid.value, ap.security, wfx_rsi.sec.security);
+ status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms);
+ // sl_wifi_connect returns SL_STATUS_IN_PROGRESS if join is in progress
+ // after the initial scan is done, the scan does not check for SSID
+ ReturnErrorCodeIf((status == SL_STATUS_OK || status == SL_STATUS_IN_PROGRESS), status);
- sl_wifi_client_configuration_t ap = { 0 };
- uint32_t timeout_ms = 0;
+ // failure only happens when the firmware returns an error
+ ChipLogError(DeviceLayer, "wfx_rsi_do_join: sl_wifi_connect failed: 0x%lx", static_cast<uint32_t>(status));
+ VerifyOrReturnError((is_wifi_disconnection_event || wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT), status);
- ap.ssid.length = strlen(wfx_rsi.sec.ssid);
- memcpy(ap.ssid.value, (int8_t *) &wfx_rsi.sec.ssid[0], ap.ssid.length);
- ap.security = connect_security_mode;
- ap.encryption = SL_WIFI_NO_ENCRYPTION;
- ap.credential_id = id;
- if ((status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms)) == SL_STATUS_IN_PROGRESS)
- {
- callback_status = SL_STATUS_IN_PROGRESS;
- while (callback_status == SL_STATUS_IN_PROGRESS)
- {
- osThreadYield();
- }
- status = callback_status;
- }
- else
- {
- if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN)
- {
- SILABS_LOG("wfx_rsi_do_join: Wifi connect failed with status: %x", status);
- SILABS_LOG("wfx_rsi_do_join: starting JOIN to %s after %d tries\n", (char *) &wfx_rsi.sec.ssid[0],
- wfx_rsi.join_retries);
- wfx_rsi.join_retries += 1;
- wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
- wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries);
- if (is_wifi_disconnection_event || wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT)
- {
- event.eventType = WFX_EVT_STA_START_JOIN;
- WfxPostEvent(&event);
- }
- }
- }
- }
+ wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
+ ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: retry attempt %d", wfx_rsi.join_retries);
+ wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries);
+ wfx_rsi.join_retries++;
+ event.eventType = WFX_EVT_STA_START_JOIN;
+ WfxPostEvent(&event);
return status;
}
@@ -765,7 +726,7 @@
if (sta_netif == NULL)
{
// TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state
- SILABS_LOG("HandleDHCPPolling: failed to get STA netif");
+ ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif");
return;
}
#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
@@ -787,6 +748,9 @@
*/
if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
{
+ char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
+ VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != NULL);
+ ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
wfx_ipv6_notify(GET_IPV6_SUCCESS);
hasNotifiedIPV6 = true;
event.eventType = WFX_EVT_STA_DHCP_DONE;
@@ -801,7 +765,7 @@
if (status != osOK)
{
- SILABS_LOG("WfxPostEvent: failed to post event with status: %d", status);
+ ChipLogError(DeviceLayer, "WfxPostEvent: failed to post event: 0x%lx", static_cast<uint32_t>(status));
// TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc.
}
}
@@ -829,7 +793,7 @@
switch (inEvent.eventType)
{
case WFX_EVT_STA_CONN:
- SILABS_LOG("%s: starting LwIP STA", __func__);
+ ChipLogDetail(DeviceLayer, "WFX_EVT_STA_CONN");
wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED;
ResetDHCPNotificationFlags();
wfx_lwip_set_sta_link_up();
@@ -840,10 +804,10 @@
// is independant of IP connectivity.
break;
case WFX_EVT_STA_DISCONN:
+ ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DISCONN");
// TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something
wfx_rsi.dev_state &=
~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE);
- SILABS_LOG("%s: disconnect notify", __func__);
/* TODO: Implement disconnect notify */
ResetDHCPNotificationFlags();
wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) ->
@@ -863,9 +827,9 @@
#ifdef SL_WFX_CONFIG_SCAN
if (!(wfx_rsi.dev_state & WFX_RSI_ST_SCANSTARTED))
{
- SILABS_LOG("%s: start SSID scan", __func__);
+ ChipLogDetail(DeviceLayer, "WFX_EVT_SCAN");
sl_wifi_scan_configuration_t wifi_scan_configuration;
- memset(&wifi_scan_configuration, 0, sizeof(sl_wifi_scan_configuration_t));
+ memset(&wifi_scan_configuration, 0, sizeof(wifi_scan_configuration));
// TODO: Add scan logic
sl_wifi_advanced_scan_configuration_t advanced_scan_configuration = { 0 };
@@ -879,7 +843,7 @@
if (SL_STATUS_OK != status)
{
// TODO: Seems like Chipdie should be called here, the device should be initialized here
- SILABS_LOG("Failed to set advanced scan configuration with status: %d", status);
+ ChipLogError(DeviceLayer, "sl_wifi_set_advanced_scan_configuration failed: 0x%lx", static_cast<uint32_t>(status));
return;
}
@@ -942,13 +906,13 @@
WfxEvent_t wfxEvent;
if (status != RSI_SUCCESS)
{
- SILABS_LOG("wfx_rsi_task: error: wfx_rsi_init with status: %02x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_task: wfx_rsi_init failed: 0x%lx", static_cast<uint32_t>(status));
return;
}
wfx_lwip_start();
wfx_started_notify();
- SILABS_LOG("wfx_rsi_task: starting event loop");
+ ChipLogDetail(DeviceLayer, "wfx_rsi_task: starting event loop");
for (;;)
{
status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever);
@@ -958,8 +922,7 @@
}
else
{
- // TODO: Everywhere in this file(and related) SILABS_LOG ---> Chiplog
- SILABS_LOG("Failed to get event with status: %x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_task: get event failed: 0x%lx", static_cast<uint32_t>(status));
}
}
}
@@ -982,8 +945,8 @@
wfx_rsi.ip4_addr[1] = (ip >> 8) & HEX_VALUE_FF;
wfx_rsi.ip4_addr[2] = (ip >> 16) & HEX_VALUE_FF;
wfx_rsi.ip4_addr[3] = (ip >> 24) & HEX_VALUE_FF;
- SILABS_LOG("%s: DHCP OK: IP=%d.%d.%d.%d", __func__, wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
- wfx_rsi.ip4_addr[3]);
+ ChipLogDetail(DeviceLayer, "DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
+ wfx_rsi.ip4_addr[3]);
/* Notify the Connectivity Manager - via the app */
wfx_rsi.dev_state |= WFX_RSI_ST_STA_DHCP_DONE;
wfx_ip_changed_notify(IP_STATUS_SUCCESS);
diff --git a/examples/platform/silabs/efr32/rs911x/rsi_if.c b/examples/platform/silabs/efr32/rs911x/rsi_if.c
index 3596b09..a08e2a2 100644
--- a/examples/platform/silabs/efr32/rs911x/rsi_if.c
+++ b/examples/platform/silabs/efr32/rs911x/rsi_if.c
@@ -142,7 +142,7 @@
uint8_t rssi;
ap->security = wfx_rsi.sec.security;
ap->chan = wfx_rsi.ap_chan;
- memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
status = rsi_wlan_get(RSI_RSSI, &rssi, sizeof(rssi));
if (status == RSI_SUCCESS)
{
@@ -493,7 +493,7 @@
}
wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
wfx_rsi.ap_chan = rsp.scan_info->rf_channel;
- memcpy(&wfx_rsi.ap_mac.octet[0], &rsp.scan_info->bssid[0], BSSID_MAX_STR_LEN);
+ memcpy(&wfx_rsi.ap_mac.octet[0], &rsp.scan_info->bssid[0], BSSID_LEN);
switch (rsp.scan_info->security_mode)
{
@@ -753,9 +753,9 @@
strncpy(ap.ssid, (char *) scan->ssid, MIN(sizeof(ap.ssid), sizeof(scan->ssid)));
ap.security = scan->security_mode;
ap.rssi = (-1) * scan->rssi_val;
- configASSERT(sizeof(ap.bssid) >= BSSID_MAX_STR_LEN);
- configASSERT(sizeof(scan->bssid) >= BSSID_MAX_STR_LEN);
- memcpy(ap.bssid, scan->bssid, BSSID_MAX_STR_LEN);
+ configASSERT(sizeof(ap.bssid) >= BSSID_LEN);
+ configASSERT(sizeof(scan->bssid) >= BSSID_LEN);
+ memcpy(ap.bssid, scan->bssid, BSSID_LEN);
(*wfx_rsi.scan_cb)(&ap);
if (wfx_rsi.scan_ssid)
diff --git a/examples/platform/silabs/efr32/wf200/host_if.cpp b/examples/platform/silabs/efr32/wf200/host_if.cpp
index 041a177..ac3ad07 100644
--- a/examples/platform/silabs/efr32/wf200/host_if.cpp
+++ b/examples/platform/silabs/efr32/wf200/host_if.cpp
@@ -335,7 +335,7 @@
}
ap->scan.chan = scan_result->channel;
ap->scan.rssi = scan_result->rcpi;
- memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_LEN);
scan_count++;
}
}
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
index e3f9238..745de9b 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
+++ b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
@@ -41,7 +41,10 @@
#define SL_WFX_CONNECT_IND_ID (2)
#define SL_WFX_DISCONNECT_IND_ID (3)
#define SL_WFX_SCAN_COMPLETE_ID (4)
-#define WFX_RSI_SSID_SIZE (64)
+// MAX SSID LENGTH excluding NULL character
+#define WFX_MAX_SSID_LENGTH (32)
+// MAX PASSKEY LENGTH including NULL character
+#define WFX_MAX_PASSKEY_LENGTH (SL_WIFI_MAX_PSK_LENGTH)
/* Wi-Fi bitmask events - for the task */
#define SL_WFX_CONNECT (1 << 1)
@@ -55,6 +58,7 @@
#define WLAN_TASK_STACK_SIZE (1024)
#define WLAN_TASK_PRIORITY (3)
#define WLAN_DRIVER_TASK_PRIORITY (2)
+#define BLE_DRIVER_TASK_PRIORITY (2)
#define MAX_JOIN_RETRIES_COUNT (5)
// WLAN retry time intervals in milli seconds
@@ -66,7 +70,7 @@
// WLAN related Macros
#define ETH_FRAME (0)
#define CMP_SUCCESS (0)
-#define BSSID_MAX_STR_LEN (6)
+#define BSSID_LEN (6)
#define MAC_ADDRESS_FIRST_OCTET (6)
#define AP_START_SUCCESS (0)
#define BITS_TO_WAIT (0)
@@ -159,8 +163,8 @@
typedef struct
{
- char ssid[32 + 1];
- char passkey[64 + 1];
+ char ssid[WFX_MAX_SSID_LENGTH + 1];
+ char passkey[WFX_MAX_PASSKEY_LENGTH + 1];
wfx_sec_t security;
} wfx_wifi_provision_t;
@@ -175,9 +179,9 @@
typedef struct wfx_wifi_scan_result
{
- char ssid[32 + 1];
+ char ssid[WFX_MAX_SSID_LENGTH + 1];
wfx_sec_t security;
- uint8_t bssid[6];
+ uint8_t bssid[BSSID_LEN];
uint8_t chan;
int16_t rssi; /* I suspect this is in dBm - so signed */
} wfx_wifi_scan_result_t;
diff --git a/src/platform/silabs/efr32/wifi/wfx_host_events.h b/src/platform/silabs/efr32/wifi/wfx_host_events.h
index a7a2dc2..3e83f3b 100644
--- a/src/platform/silabs/efr32/wifi/wfx_host_events.h
+++ b/src/platform/silabs/efr32/wifi/wfx_host_events.h
@@ -114,8 +114,6 @@
#define SL_WFX_CONNECT_IND_ID 2
#define SL_WFX_DISCONNECT_IND_ID 3
#define SL_WFX_SCAN_COMPLETE_ID 4
-#define WFX_RSI_SSID_SIZE 64
-
#endif /* WF200 */
/* LwIP includes. */
@@ -141,14 +139,19 @@
#define WLAN_TASK_STACK_SIZE 1024
#define WLAN_TASK_PRIORITY 1
#define WLAN_DRIVER_TASK_PRIORITY 1
+#define BLE_DRIVER_TASK_PRIORITY 1
#define MAX_JOIN_RETRIES_COUNT 5
#else /* WF200 */
#define WLAN_TASK_STACK_SIZE 1024
#define WLAN_TASK_PRIORITY 1
-#define BLE_TASK_PRIORITY 1
#define MAX_JOIN_RETRIES_COUNT 5
-#endif
+#endif // RS911X_WIFI
+
+// MAX SSID LENGTH excluding NULL character
+#define WFX_MAX_SSID_LENGTH (32)
+// MAX PASSKEY LENGTH including NULL character
+#define WFX_MAX_PASSKEY_LENGTH (64)
// WLAN retry time intervals in milli seconds
#define WLAN_MAX_RETRY_TIMER_MS 30000
@@ -159,7 +162,7 @@
// WLAN related Macros
#define ETH_FRAME 0
#define CMP_SUCCESS 0
-#define BSSID_MAX_STR_LEN 6
+#define BSSID_LEN (6)
#define MAC_ADDRESS_FIRST_OCTET 6
#define AP_START_SUCCESS 0
#define BITS_TO_WAIT 0
@@ -254,8 +257,8 @@
typedef struct
{
- char ssid[32 + 1];
- char passkey[64 + 1];
+ char ssid[WFX_MAX_SSID_LENGTH + 1];
+ char passkey[WFX_MAX_PASSKEY_LENGTH + 1];
wfx_sec_t security;
} wfx_wifi_provision_t;
@@ -270,9 +273,9 @@
typedef struct wfx_wifi_scan_result
{
- char ssid[32 + 1];
+ char ssid[WFX_MAX_SSID_LENGTH + 1];
wfx_sec_t security;
- uint8_t bssid[6];
+ uint8_t bssid[BSSID_LEN];
uint8_t chan;
int16_t rssi; /* I suspect this is in dBm - so signed */
} wfx_wifi_scan_result_t;
diff --git a/src/platform/silabs/rs911x/BLEManagerImpl.cpp b/src/platform/silabs/rs911x/BLEManagerImpl.cpp
index 962c78f..bce62e7 100644
--- a/src/platform/silabs/rs911x/BLEManagerImpl.cpp
+++ b/src/platform/silabs/rs911x/BLEManagerImpl.cpp
@@ -253,8 +253,8 @@
sl_rs_ble_init_sem = osSemaphoreNew(1, 0, NULL);
sl_ble_event_sem = osSemaphoreNew(1, 0, NULL);
- wfx_rsi.ble_task = xTaskCreateStatic((TaskFunction_t) sl_ble_event_handling_task, "rsi_ble", WFX_RSI_TASK_SZ, NULL, 1,
- wfxBLETaskStack, &rsiBLETaskStruct);
+ wfx_rsi.ble_task = xTaskCreateStatic((TaskFunction_t) sl_ble_event_handling_task, "rsi_ble", WFX_RSI_TASK_SZ, NULL,
+ BLE_DRIVER_TASK_PRIORITY, wfxBLETaskStack, &rsiBLETaskStruct);
if (wfx_rsi.ble_task == NULL)
{
@@ -419,7 +419,6 @@
case DeviceEventType::kCHIPoBLEIndicateConfirm: {
ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEIndicateConfirm");
- DeviceLayer::SystemLayer().CancelTimer(OnSendIndicationTimeout, this);
HandleIndicationConfirmation(event->CHIPoBLEIndicateConfirm.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID);
}
break;
@@ -924,6 +923,10 @@
void BLEManagerImpl::HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId)
{
+ DeviceLayer::PlatformMgr().LockChipStack();
+ // stop the indication confirmation timer
+ DeviceLayer::SystemLayer().CancelTimer(OnSendIndicationTimeout, this);
+ DeviceLayer::PlatformMgr().UnlockChipStack();
ChipDeviceEvent event;
event.Type = DeviceEventType::kCHIPoBLEIndicateConfirm;
event.CHIPoBLEIndicateConfirm.ConId = conId;