Skip to content

Commit e9a3224

Browse files
Martin-NXPchapongatien
authored andcommitted
[NXP][platform][common] Call OnScanWiFiNetworkDone function in the context of the Matter stack to avoid chipDie issue (project-chip#33873)
Signed-off-by: Martin Girardot <martin.girardot@nxp.com> Co-authored-by: Gatien Chapon <43855183+chapongatien@users.noreply.github.com>
1 parent a6e1795 commit e9a3224

4 files changed

+27
-4
lines changed

src/platform/nxp/common/CHIPDevicePlatformEvent.h

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ enum InternalPlatformSpecificEventTypes
6969
kPlatformNxpWlanEvent,
7070
kPlatformNxpIpChangeEvent,
7171
kPlatformNxpStartWlanConnectEvent,
72+
kPlatformNxpScanWiFiNetworkDoneEvent,
7273
};
7374

7475
} // namespace DeviceEventType
@@ -116,6 +117,7 @@ struct ChipDevicePlatformEvent final
116117
#if CHIP_DEVICE_CONFIG_ENABLE_WPA
117118
enum wlan_event_reason WlanEventReason;
118119
struct wlan_network * pNetworkDataEvent;
120+
unsigned int ScanWiFiNetworkCount;
119121
#endif
120122
};
121123
};

src/platform/nxp/common/ConnectivityManagerImpl.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
153153
free(event->Platform.pNetworkDataEvent);
154154
}
155155
}
156+
else if (event->Type == kPlatformNxpScanWiFiNetworkDoneEvent)
157+
{
158+
NetworkCommissioning::NXPWiFiDriver::GetInstance().ScanWiFINetworkDoneFromMatterTaskContext(
159+
event->Platform.ScanWiFiNetworkCount);
160+
}
156161
#endif
157162
}
158163

src/platform/nxp/common/NetworkCommissioningDriver.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ class NXPWiFiDriver final : public WiFiDriver
9292

9393
CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen);
9494
void OnConnectWiFiNetwork(Status commissioningError, CharSpan debugText, int32_t connectStatus);
95-
static int OnScanWiFiNetworkDone(unsigned int count);
95+
int ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count);
96+
static int _OnScanWiFiNetworkDoneCallBack(unsigned int count);
9697
static NXPWiFiDriver & GetInstance()
9798
{
9899
static NXPWiFiDriver instance;

src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
270270
ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) requested");
271271

272272
(void) memset(&wlan_scan_param, 0, sizeof(wlan_scan_params_v2_t));
273-
wlan_scan_param.cb = &NXPWiFiDriver::OnScanWiFiNetworkDone;
273+
wlan_scan_param.cb = &NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack;
274274

275275
if ((ssid.size() > 0) && (ssid.size() < MLAN_MAX_SSID_LENGTH))
276276
{
@@ -291,8 +291,23 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid)
291291
return CHIP_NO_ERROR;
292292
}
293293

294-
// TODO should be modified to do it in the context of the Matter stack
295-
int NXPWiFiDriver::OnScanWiFiNetworkDone(unsigned int count)
294+
int NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack(unsigned int count)
295+
{
296+
ChipDeviceEvent event;
297+
event.Type = DeviceEventType::kPlatformNxpScanWiFiNetworkDoneEvent;
298+
event.Platform.ScanWiFiNetworkCount = count;
299+
CHIP_ERROR err = PlatformMgr().PostEvent(&event);
300+
if (err != CHIP_NO_ERROR)
301+
{
302+
ChipLogError(DeviceLayer, "Failed to schedule work: %" CHIP_ERROR_FORMAT, err.Format());
303+
return WM_FAIL;
304+
}
305+
return WM_SUCCESS;
306+
}
307+
308+
// The processing of the scan callback should be done in the context of the Matter stack, as the scan callback will call Matter
309+
// stack APIs
310+
int NXPWiFiDriver::ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count)
296311
{
297312
ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) done, found: %u", count);
298313

0 commit comments

Comments
 (0)