From 2f61dc8ddf0e4314df00a260db6b3d2f6d943f08 Mon Sep 17 00:00:00 2001 From: Martin Girardot Date: Thu, 11 Apr 2024 10:25:48 +0200 Subject: [PATCH] [NXP][platform][common] Call OnScanWiFiNetworkDone function in the context of the Matter stack to avoid chipDie issue Signed-off-by: Martin Girardot --- .../nxp/common/CHIPDevicePlatformEvent.h | 2 ++ .../nxp/common/ConnectivityManagerImpl.cpp | 5 +++++ .../nxp/common/NetworkCommissioningDriver.h | 3 ++- .../common/NetworkCommissioningWiFiDriver.cpp | 21 ++++++++++++++++--- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/platform/nxp/common/CHIPDevicePlatformEvent.h b/src/platform/nxp/common/CHIPDevicePlatformEvent.h index e3167f5cc2240f..4ea4ffcd304dbe 100644 --- a/src/platform/nxp/common/CHIPDevicePlatformEvent.h +++ b/src/platform/nxp/common/CHIPDevicePlatformEvent.h @@ -69,6 +69,7 @@ enum InternalPlatformSpecificEventTypes kPlatformNxpWlanEvent, kPlatformNxpIpChangeEvent, kPlatformNxpStartWlanConnectEvent, + kPlatformNxpScanWiFiNetworkDoneEvent, }; } // namespace DeviceEventType @@ -116,6 +117,7 @@ struct ChipDevicePlatformEvent final #if CHIP_DEVICE_CONFIG_ENABLE_WPA enum wlan_event_reason WlanEventReason; struct wlan_network * pNetworkDataEvent; + unsigned int ScanWiFiNetworkCount; #endif }; }; diff --git a/src/platform/nxp/common/ConnectivityManagerImpl.cpp b/src/platform/nxp/common/ConnectivityManagerImpl.cpp index c9d2861686b143..0055690188a79e 100644 --- a/src/platform/nxp/common/ConnectivityManagerImpl.cpp +++ b/src/platform/nxp/common/ConnectivityManagerImpl.cpp @@ -153,6 +153,11 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) free(event->Platform.pNetworkDataEvent); } } + else if (event->Type == kPlatformNxpScanWiFiNetworkDoneEvent) + { + NetworkCommissioning::NXPWiFiDriver::GetInstance().ScanWiFINetworkDoneFromMatterTaskContext( + event->Platform.ScanWiFiNetworkCount); + } #endif } diff --git a/src/platform/nxp/common/NetworkCommissioningDriver.h b/src/platform/nxp/common/NetworkCommissioningDriver.h index 33d7d5bc1ed3af..a9f5807018d631 100644 --- a/src/platform/nxp/common/NetworkCommissioningDriver.h +++ b/src/platform/nxp/common/NetworkCommissioningDriver.h @@ -92,7 +92,8 @@ class NXPWiFiDriver final : public WiFiDriver CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen); void OnConnectWiFiNetwork(Status commissioningError, CharSpan debugText, int32_t connectStatus); - static int OnScanWiFiNetworkDone(unsigned int count); + int ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count); + static int _OnScanWiFiNetworkDoneCallBack(unsigned int count); static NXPWiFiDriver & GetInstance() { static NXPWiFiDriver instance; diff --git a/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp b/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp index c201dad7a6661c..e1348f946c1865 100644 --- a/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp @@ -270,7 +270,7 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid) ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) requested"); (void) memset(&wlan_scan_param, 0, sizeof(wlan_scan_params_v2_t)); - wlan_scan_param.cb = &NXPWiFiDriver::OnScanWiFiNetworkDone; + wlan_scan_param.cb = &NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack; if ((ssid.size() > 0) && (ssid.size() < MLAN_MAX_SSID_LENGTH)) { @@ -291,8 +291,23 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid) return CHIP_NO_ERROR; } -// TODO should be modified to do it in the context of the Matter stack -int NXPWiFiDriver::OnScanWiFiNetworkDone(unsigned int count) +int NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack(unsigned int count) +{ + ChipDeviceEvent event; + event.Type = DeviceEventType::kPlatformNxpScanWiFiNetworkDoneEvent; + event.Platform.ScanWiFiNetworkCount = count; + CHIP_ERROR err = PlatformMgr().PostEvent(&event); + if (err != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "Failed to schedule work: %" CHIP_ERROR_FORMAT, err.Format()); + return WM_FAIL; + } + return WM_SUCCESS; +} + +// The processing of the scan callback should be done in the context of the Matter stack, as the scan callback will call Matter +// stack APIs +int NXPWiFiDriver::ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count) { ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) done, found: %u", count);