Skip to content

Commit ef43e5b

Browse files
tcarmelveilleuxweb-flow
authored andcommitted
Fix NetworkCommissioning post-review from #32156 (#32172)
* Fix NetworkCommissioning post-review from #32156 - Found a regression on Thread scanning. - Changed some ConstraintError to InvalidCommand where more applicable. - Removed an update of cluster state on fail safe expiry. Testing done: - Retested on Wi-Fi - Testing on Thread as well * Re-notify errors on empty network at fail-safe expiry * Fix MobileDeviceTest * Fix Cirque tests
1 parent 96c9357 commit ef43e5b

File tree

2 files changed

+59
-9
lines changed

2 files changed

+59
-9
lines changed

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

+41-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,9 @@ void Instance::HandleScanNetworks(HandlerContext & ctx, const Commands::ScanNetw
266266
}
267267
if (ssid.size() > DeviceLayer::Internal::kMaxWiFiSSIDLength)
268268
{
269-
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::InvalidCommand);
269+
// Clients should never use too large a SSID.
270+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::ConstraintError);
271+
SetLastNetworkingStatusValue(MakeNullable(Status::kUnknownError));
270272
return;
271273
}
272274
mCurrentOperationBreadcrumb = req.breadcrumb;
@@ -276,6 +278,13 @@ void Instance::HandleScanNetworks(HandlerContext & ctx, const Commands::ScanNetw
276278
}
277279
else if (mFeatureFlags.Has(NetworkCommissioningFeature::kThreadNetworkInterface))
278280
{
281+
// SSID present on Thread violates the `[WI]` conformance.
282+
if (req.ssid.HasValue())
283+
{
284+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::InvalidCommand);
285+
return;
286+
}
287+
279288
mCurrentOperationBreadcrumb = req.breadcrumb;
280289
mAsyncCommandHandle = CommandHandler::Handle(&ctx.mCommandHandler);
281290
ctx.mCommandHandler.FlushAcksRightAwayOnSlowCommand();
@@ -322,6 +331,26 @@ void Instance::HandleAddOrUpdateWiFiNetwork(HandlerContext & ctx, const Commands
322331

323332
VerifyOrReturn(CheckFailSafeArmed(ctx));
324333

334+
if (req.ssid.empty() || req.ssid.size() > DeviceLayer::Internal::kMaxWiFiSSIDLength)
335+
{
336+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::ConstraintError, "ssid");
337+
return;
338+
}
339+
340+
// Presence of a Network Identity indicates we're configuring for Per-Device Credentials
341+
if (req.networkIdentity.HasValue())
342+
{
343+
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_PDC
344+
if (mFeatureFlags.Has(Feature::kWiFiNetworkInterface))
345+
{
346+
HandleAddOrUpdateWiFiNetworkWithPDC(ctx, req);
347+
return;
348+
}
349+
#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_PDC
350+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::InvalidCommand);
351+
return;
352+
}
353+
325354
// Spec 11.8.8.4
326355
// Valid Credentials length are:
327356
// - 0 bytes: Unsecured (open) connection
@@ -671,6 +700,17 @@ void Instance::OnFailSafeTimerExpired()
671700
ChipLogDetail(Zcl, "Failsafe timeout, tell platform driver to revert network credentials.");
672701
mpWirelessDriver->RevertConfiguration();
673702
mAsyncCommandHandle.Release();
703+
704+
// Mark the network list changed since `mpWirelessDriver->RevertConfiguration()` may have updated it.
705+
ReportNetworksListChanged();
706+
707+
// If no networks are left, clear-out errors;
708+
if (mpBaseDriver && (CountAndRelease(mpBaseDriver->GetNetworks()) == 0))
709+
{
710+
SetLastNetworkId(ByteSpan{});
711+
SetLastConnectErrorValue(NullNullable);
712+
SetLastNetworkingStatusValue(NullNullable);
713+
}
674714
}
675715

676716
CHIP_ERROR Instance::EnumerateAcceptedCommands(const ConcreteClusterPath & cluster, CommandIdCallback callback, void * context)

src/controller/python/test/test_scripts/network_commissioning.py

+18-8
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,16 @@ async def test_wifi(self, endpointId):
140140
f"LastNetworkID, LastNetworkingStatus and LastConnectErrorValue should be Null")
141141

142142
# Scan networks
143-
logger.info(f"Scan networks")
144-
req = Clusters.NetworkCommissioning.Commands.ScanNetworks(
145-
ssid=b'', breadcrumb=self.with_breadcrumb())
146-
res = await self._devCtrl.SendCommand(nodeid=self._nodeid, endpoint=endpointId, payload=req)
143+
logger.info("Scan networks")
144+
req = Clusters.NetworkCommissioning.Commands.ScanNetworks(breadcrumb=self.with_breadcrumb())
145+
interactionTimeoutMs = self._devCtrl.ComputeRoundTripTimeout(self._nodeid, upperLayerProcessingTimeoutMs=30000)
146+
logger.info(f"Request: {req}")
147+
res = await self._devCtrl.SendCommand(
148+
nodeid=self._nodeid,
149+
endpoint=endpointId,
150+
payload=req,
151+
interactionTimeoutMs=interactionTimeoutMs
152+
)
147153
logger.info(f"Received response: {res}")
148154
if res.networkingStatus != Clusters.NetworkCommissioning.Enums.NetworkCommissioningStatus.kSuccess:
149155
raise AssertionError(f"Unexpected result: {res.networkingStatus}")
@@ -274,10 +280,14 @@ async def test_thread(self, endpointId):
274280
f"LastNetworkID, LastNetworkingStatus and LastConnectErrorValue should be Null")
275281

276282
# Scan networks
277-
logger.info(f"Scan networks")
278-
req = Clusters.NetworkCommissioning.Commands.ScanNetworks(
279-
ssid=b'', breadcrumb=self.with_breadcrumb())
280-
res = await self._devCtrl.SendCommand(nodeid=self._nodeid, endpoint=endpointId, payload=req)
283+
logger.info("Scan networks")
284+
req = Clusters.NetworkCommissioning.Commands.ScanNetworks(breadcrumb=self.with_breadcrumb())
285+
logger.info(f"Request: {req}")
286+
interactionTimeoutMs = self._devCtrl.ComputeRoundTripTimeout(self._nodeid, upperLayerProcessingTimeoutMs=30000)
287+
res = await self._devCtrl.SendCommand(nodeid=self._nodeid,
288+
endpoint=endpointId,
289+
payload=req,
290+
interactionTimeoutMs=interactionTimeoutMs)
281291
logger.info(f"Received response: {res}")
282292
if res.networkingStatus != Clusters.NetworkCommissioning.Enums.NetworkCommissioningStatus.kSuccess:
283293
raise AssertionError(f"Unexpected result: {res.networkingStatus}")

0 commit comments

Comments
 (0)