Skip to content

Commit b54e8c5

Browse files
[nrf noup] Directed network scan implementation
Implementation of directed scaning, to adjust to newer matter version specification. Signed-off-by: Patryk Lipinski <patryk.lipinski@nordicsemi.no>
1 parent 7653e6c commit b54e8c5

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed

src/app/clusters/network-commissioning/network-commissioning.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,8 @@ void Instance::OnNetworkingStatusChange(NetworkCommissioning::Status aCommission
244244
void Instance::HandleScanNetworks(HandlerContext & ctx, const Commands::ScanNetworks::DecodableType & req)
245245
{
246246
MATTER_TRACE_SCOPE("HandleScanNetwork", "NetworkCommissioning");
247+
248+
mScanningWasDirected = false;
247249
if (mFeatureFlags.Has(Feature::kWiFiNetworkInterface))
248250
{
249251
ByteSpan ssid;
@@ -266,6 +268,7 @@ void Instance::HandleScanNetworks(HandlerContext & ctx, const Commands::ScanNetw
266268
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::InvalidCommand);
267269
return;
268270
}
271+
mScanningWasDirected = !ssid.empty();
269272
mCurrentOperationBreadcrumb = req.breadcrumb;
270273
mAsyncCommandHandle = CommandHandler::Handle(&ctx.mCommandHandler);
271274
ctx.mCommandHandler.FlushAcksRightAwayOnSlowCommand();
@@ -518,6 +521,13 @@ void Instance::OnFinished(Status status, CharSpan debugText, ThreadScanResponseI
518521
return;
519522
}
520523

524+
// If drivers are failing to respond NetworkNotFound on empty results, force it for them.
525+
bool resultsMissing = !networks || (networks->Count() == 0);
526+
if ((status == Status::kSuccess) && mScanningWasDirected && resultsMissing)
527+
{
528+
status = Status::kNetworkNotFound;
529+
}
530+
521531
mLastNetworkingStatusValue.SetNonNull(status);
522532

523533
TLV::TLVWriter * writer;

src/app/clusters/network-commissioning/network-commissioning.h

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ class Instance : public CommandHandlerInterface,
102102

103103
Optional<uint64_t> mCurrentOperationBreadcrumb;
104104

105+
bool mScanningWasDirected = false;
106+
105107
// Commits the breadcrumb value saved in mCurrentOperationBreadcrumb to the breadcrumb attribute in GeneralCommissioning
106108
// cluster. Will set mCurrentOperationBreadcrumb to NullOptional.
107109
void CommitSavedBreadcrumb();

src/platform/nrfconnect/wifi/WiFiManager.cpp

+22-3
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,13 @@ CHIP_ERROR WiFiManager::Scan(const ByteSpan & ssid, ScanResultCallback resultCal
188188
mWiFiState = WIFI_STATE_SCANNING;
189189
mSsidFound = false;
190190

191+
if ((ssid.size() > 0) && (!mInternalScan))
192+
{
193+
mDirectScanNetwork.Erase();
194+
memcpy(mDirectScanNetwork.ssid, ssid.data(), ssid.size());
195+
mDirectScanNetwork.ssidLen = ssid.size();
196+
}
197+
191198
if (0 != net_mgmt(NET_REQUEST_WIFI_SCAN, mNetIf, NULL, 0))
192199
{
193200
ChipLogError(DeviceLayer, "Scan request failed");
@@ -334,7 +341,14 @@ void WiFiManager::ScanResultHandler(Platform::UniquePtr<uint8_t> data)
334341

335342
if (Instance().mScanResultCallback && !Instance().mInternalScan)
336343
{
337-
Instance().mScanResultCallback(ToScanResponse(scanResult));
344+
if (Instance().mDirectScanNetwork.GetSsidSpan().size() == 0)
345+
{
346+
Instance().mScanResultCallback(ToScanResponse(scanResult));
347+
}
348+
else if (Instance().mDirectScanNetwork.GetSsidSpan().data_equal(ByteSpan(scanResult->ssid, scanResult->ssid_length)))
349+
{
350+
Instance().mScanResultCallback(ToScanResponse(scanResult));
351+
}
338352
}
339353
}
340354

@@ -345,6 +359,11 @@ void WiFiManager::ScanDoneHandler(Platform::UniquePtr<uint8_t> data)
345359
uint8_t * rawData = safePtr.get();
346360
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
347361

362+
if (Instance().mDirectScanNetwork.GetSsidSpan().size() > 0)
363+
{
364+
Instance().mDirectScanNetwork.Erase();
365+
}
366+
348367
if (status->status)
349368
{
350369
ChipLogError(DeviceLayer, "Wi-Fi scan finalization failure (%d)", status->status);
@@ -420,8 +439,8 @@ void WiFiManager::ConnectHandler(Platform::UniquePtr<uint8_t> data)
420439
{
421440
CHIP_ERROR err = SystemLayer().ScheduleLambda([capturedData = data.get()] {
422441
Platform::UniquePtr<uint8_t> safePtr(capturedData);
423-
uint8_t * rawData = safePtr.get();
424-
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
442+
uint8_t * rawData = safePtr.get();
443+
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
425444

426445
if (status->status)
427446
{

src/platform/nrfconnect/wifi/WiFiManager.h

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ class WiFiManager
226226
ScanResultCallback mScanResultCallback{ nullptr };
227227
ScanDoneCallback mScanDoneCallback{ nullptr };
228228
WiFiNetwork mWantedNetwork{};
229+
WiFiNetwork mDirectScanNetwork{};
229230
bool mInternalScan{ false };
230231
uint8_t mRouterSolicitationCounter = 0;
231232
bool mSsidFound{ false };

0 commit comments

Comments
 (0)