Skip to content

Commit 2289669

Browse files
cecillerestyled-commits
authored andcommitted
Commissioning: Implement time sync requirements (#27812)
* Commissioning: Implement time sync requirements Tests added in TestCommissioningTimeSync.py Test: Ran TestCommissioningTimeSync.py against all-clusters (has a time cluster) and lock (no time cluster) commissioned all-clusters and lock with chip-tool * Add missing include * Note to self: commit ALL changes before uploading * Restyled by isort * Fix CGEN test for commissioning. * Read time sync in initial read, fabrics later Also fix tests * Remove extra log * Add new pairing delegate call, fix tv-app --------- Co-authored-by: Restyled.io <[email protected]>
1 parent 5172606 commit 2289669

14 files changed

+876
-126
lines changed

.github/workflows/tests.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ jobs:
450450
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_decode 1" --script "src/python_testing/TC_DA_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values"'
451451
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_decode 1" --script "src/python_testing/TC_TIMESYNC_3_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021"'
452452
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_decode 1" --script "src/python_testing/TC_DA_1_5.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values"'
453+
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_decode 1" --script "src/python_testing/TestCommissioningTimeSync.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021"'
453454
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_decode 1" --script "src/python_testing/TC_IDM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021"'
454455
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TestMatterTestingSupport.py"'
455456
- name: Uploading core files

examples/platform/linux/CommissionerMain.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ class PairingCommand : public Controller::DevicePairingDelegate
248248
void OnCommissioningStatusUpdate(PeerId peerId, CommissioningStage stageCompleted, CHIP_ERROR error) override;
249249

250250
void OnReadCommissioningInfo(const ReadCommissioningInfo & info) override;
251+
void OnFabricCheck(const MatchingFabricInfo & info) override;
251252

252253
private:
253254
#if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
@@ -344,7 +345,10 @@ void PairingCommand::OnReadCommissioningInfo(const ReadCommissioningInfo & info)
344345
{
345346
ChipLogProgress(AppServer, "OnReadCommissioningInfo - vendorId=0x%04X productId=0x%04X", info.basic.vendorId,
346347
info.basic.productId);
348+
}
347349

350+
void PairingCommand::OnFabricCheck(const MatchingFabricInfo & info)
351+
{
348352
if (info.nodeId != kUndefinedNodeId)
349353
{
350354
ChipLogProgress(AppServer, "ALREADY ON FABRIC WITH nodeId=0x" ChipLogFormatX64, ChipLogValueX64(info.nodeId));

src/controller/AutoCommissioner.cpp

+84-2
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,53 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
242242
// Per the spec, we restart from after adding the NOC.
243243
return GetNextCommissioningStage(CommissioningStage::kSendNOC, lastErr);
244244
}
245+
if (mParams.GetCheckForMatchingFabric())
246+
{
247+
return CommissioningStage::kCheckForMatchingFabric;
248+
}
249+
return CommissioningStage::kArmFailsafe;
250+
case CommissioningStage::kCheckForMatchingFabric:
245251
return CommissioningStage::kArmFailsafe;
246252
case CommissioningStage::kArmFailsafe:
247253
return CommissioningStage::kConfigRegulatory;
248254
case CommissioningStage::kConfigRegulatory:
255+
if (mDeviceCommissioningInfo.requiresUTC)
256+
{
257+
return CommissioningStage::kConfigureUTCTime;
258+
}
259+
else
260+
{
261+
// Time cluster is not supported, move right to DA
262+
return CommissioningStage::kSendPAICertificateRequest;
263+
}
264+
case CommissioningStage::kConfigureUTCTime:
265+
if (mDeviceCommissioningInfo.requiresTimeZone && mParams.GetTimeZone().HasValue())
266+
{
267+
return kConfigureTimeZone;
268+
}
269+
else
270+
{
271+
return GetNextCommissioningStageInternal(CommissioningStage::kConfigureTimeZone, lastErr);
272+
}
273+
case CommissioningStage::kConfigureTimeZone:
274+
if (mNeedsDST && mParams.GetDSTOffsets().HasValue())
275+
{
276+
return CommissioningStage::kConfigureDSTOffset;
277+
}
278+
else
279+
{
280+
return GetNextCommissioningStageInternal(CommissioningStage::kConfigureDSTOffset, lastErr);
281+
}
282+
case CommissioningStage::kConfigureDSTOffset:
283+
if (mDeviceCommissioningInfo.requiresDefaultNTP && mParams.GetDefaultNTP().HasValue())
284+
{
285+
return CommissioningStage::kConfigureDefaultNTP;
286+
}
287+
else
288+
{
289+
return GetNextCommissioningStageInternal(CommissioningStage::kConfigureDefaultNTP, lastErr);
290+
}
291+
case CommissioningStage::kConfigureDefaultNTP:
249292
return CommissioningStage::kSendPAICertificateRequest;
250293
case CommissioningStage::kSendPAICertificateRequest:
251294
return CommissioningStage::kSendDACCertificateRequest;
@@ -264,6 +307,15 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
264307
case CommissioningStage::kSendTrustedRootCert:
265308
return CommissioningStage::kSendNOC;
266309
case CommissioningStage::kSendNOC:
310+
if (mDeviceCommissioningInfo.requiresTrustedTimeSource && mParams.GetTrustedTimeSource().HasValue())
311+
{
312+
return CommissioningStage::kConfigureTrustedTimeSource;
313+
}
314+
else
315+
{
316+
return GetNextCommissioningStageInternal(CommissioningStage::kConfigureTrustedTimeSource, lastErr);
317+
}
318+
case CommissioningStage::kConfigureTrustedTimeSource:
267319
// TODO(cecille): device attestation casues operational cert provisioning to happen, This should be a separate stage.
268320
// For thread and wifi, this should go to network setup then enable. For on-network we can skip right to finding the
269321
// operational network because the provisioning of certificates will trigger the device to start operational advertising.
@@ -580,11 +632,20 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
580632
.SetRemoteProductId(mDeviceCommissioningInfo.basic.productId)
581633
.SetDefaultRegulatoryLocation(mDeviceCommissioningInfo.general.currentRegulatoryLocation)
582634
.SetLocationCapability(mDeviceCommissioningInfo.general.locationCapability);
583-
if (mDeviceCommissioningInfo.nodeId != kUndefinedNodeId)
635+
// Don't send DST unless the device says it needs it
636+
mNeedsDST = false;
637+
break;
638+
case CommissioningStage::kCheckForMatchingFabric: {
639+
chip::NodeId nodeId = report.Get<MatchingFabricInfo>().nodeId;
640+
if (nodeId != kUndefinedNodeId)
584641
{
585-
mParams.SetRemoteNodeId(mDeviceCommissioningInfo.nodeId);
642+
mParams.SetRemoteNodeId(nodeId);
586643
}
587644
break;
645+
}
646+
case CommissioningStage::kConfigureTimeZone:
647+
mNeedsDST = report.Get<TimeZoneResponseInfo>().requiresDSTOffsets;
648+
break;
588649
case CommissioningStage::kSendPAICertificateRequest:
589650
SetPAI(report.Get<RequestedCertificate>().certificate);
590651
break;
@@ -650,6 +711,7 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
650711
mCommissioneeDeviceProxy = nullptr;
651712
mOperationalDeviceProxy = OperationalDeviceProxy();
652713
mDeviceCommissioningInfo = ReadCommissioningInfo();
714+
mNeedsDST = false;
653715
return CHIP_NO_ERROR;
654716
default:
655717
break;
@@ -692,6 +754,26 @@ CHIP_ERROR AutoCommissioner::PerformStep(CommissioningStage nextStage)
692754
ChipLogError(Controller, "Invalid device for commissioning");
693755
return CHIP_ERROR_INCORRECT_STATE;
694756
}
757+
// Perform any last minute parameter adjustments before calling the commissioner object
758+
switch (nextStage)
759+
{
760+
case CommissioningStage::kConfigureTimeZone:
761+
if (mParams.GetTimeZone().Value().size() > mDeviceCommissioningInfo.maxTimeZoneSize)
762+
{
763+
mParams.SetTimeZone(app::DataModel::List<app::Clusters::TimeSynchronization::Structs::TimeZoneStruct::Type>(
764+
mParams.GetTimeZone().Value().SubSpan(0, mDeviceCommissioningInfo.maxTimeZoneSize)));
765+
}
766+
break;
767+
case CommissioningStage::kConfigureDSTOffset:
768+
if (mParams.GetDSTOffsets().Value().size() > mDeviceCommissioningInfo.maxDSTSize)
769+
{
770+
mParams.SetDSTOffsets(app::DataModel::List<app::Clusters::TimeSynchronization::Structs::DSTOffsetStruct::Type>(
771+
mParams.GetDSTOffsets().Value().SubSpan(0, mDeviceCommissioningInfo.maxDSTSize)));
772+
}
773+
break;
774+
default:
775+
break;
776+
}
695777

696778
mCommissioner->PerformCommissioningStep(proxy, nextStage, mParams, this, GetEndpoint(nextStage),
697779
GetCommandTimeout(proxy, nextStage));

src/controller/AutoCommissioner.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class AutoCommissioner : public CommissioningDelegate
5454
* be used for sending the relevant command.
5555
*/
5656
Optional<System::Clock::Timeout> GetCommandTimeout(DeviceProxy * device, CommissioningStage stage) const;
57+
CommissioningParameters mParams = CommissioningParameters();
5758

5859
private:
5960
DeviceProxy * GetDeviceProxyForStep(CommissioningStage nextStage);
@@ -94,7 +95,6 @@ class AutoCommissioner : public CommissioningDelegate
9495
DeviceCommissioner * mCommissioner = nullptr;
9596
CommissioneeDeviceProxy * mCommissioneeDeviceProxy = nullptr;
9697
OperationalCredentialsDelegate * mOperationalCredentialsDelegate = nullptr;
97-
CommissioningParameters mParams = CommissioningParameters();
9898
OperationalDeviceProxy mOperationalDeviceProxy;
9999
// Memory space for the commisisoning parameters that come in as ByteSpans - the caller is not guaranteed to retain this memory
100100
uint8_t mSsid[CommissioningParameters::kMaxSsidLen];
@@ -104,6 +104,7 @@ class AutoCommissioner : public CommissioningDelegate
104104

105105
bool mNeedsNetworkSetup = false;
106106
ReadCommissioningInfo mDeviceCommissioningInfo;
107+
bool mNeedsDST = false;
107108

108109
// TODO: Why were the nonces statically allocated, but the certs dynamically allocated?
109110
uint8_t * mDAC = nullptr;

0 commit comments

Comments
 (0)