Skip to content

Commit 35b85dd

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

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-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

+19-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,11 @@ 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().empty() ||
345+
Instance().mDirectScanNetwork.GetSsidSpan().data_equal(ByteSpan(scanResult->ssid, scanResult->ssid_length)))
346+
{
347+
Instance().mScanResultCallback(ToScanResponse(scanResult));
348+
}
338349
}
339350
}
340351

@@ -345,6 +356,11 @@ void WiFiManager::ScanDoneHandler(Platform::UniquePtr<uint8_t> data)
345356
uint8_t * rawData = safePtr.get();
346357
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
347358

359+
if (Instance().mDirectScanNetwork.GetSsidSpan().size() > 0)
360+
{
361+
Instance().mDirectScanNetwork.Erase();
362+
}
363+
348364
if (status->status)
349365
{
350366
ChipLogError(DeviceLayer, "Wi-Fi scan finalization failure (%d)", status->status);
@@ -420,8 +436,8 @@ void WiFiManager::ConnectHandler(Platform::UniquePtr<uint8_t> data)
420436
{
421437
CHIP_ERROR err = SystemLayer().ScheduleLambda([capturedData = data.get()] {
422438
Platform::UniquePtr<uint8_t> safePtr(capturedData);
423-
uint8_t * rawData = safePtr.get();
424-
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
439+
uint8_t * rawData = safePtr.get();
440+
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
425441

426442
if (status->status)
427443
{

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)