@@ -298,6 +298,22 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStage(CommissioningStag
298
298
299
299
CommissioningStage AutoCommissioner::GetNextCommissioningStageNetworkSetup (CommissioningStage currentStage, CHIP_ERROR & lastErr)
300
300
{
301
+ if (IsSecondaryNetworkSupported ())
302
+ {
303
+ if (IsTriedSecondaryNetwork ())
304
+ {
305
+ // Try secondary network interface.
306
+ return mDeviceCommissioningInfo .network .wifi .endpoint == kRootEndpointId ? CommissioningStage::kThreadNetworkSetup
307
+ : CommissioningStage::kWiFiNetworkSetup ;
308
+ }
309
+ else
310
+ {
311
+ // Try primary network interface
312
+ return mDeviceCommissioningInfo .network .wifi .endpoint == kRootEndpointId ? CommissioningStage::kWiFiNetworkSetup
313
+ : CommissioningStage::kThreadNetworkSetup ;
314
+ }
315
+ }
316
+
301
317
if (mParams .GetWiFiCredentials ().HasValue () && mDeviceCommissioningInfo .network .wifi .endpoint != kInvalidEndpointId )
302
318
{
303
319
return CommissioningStage::kWiFiNetworkSetup ;
@@ -455,35 +471,15 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
455
471
case CommissioningStage::kNeedsNetworkCreds :
456
472
return GetNextCommissioningStageNetworkSetup (currentStage, lastErr);
457
473
case CommissioningStage::kWiFiNetworkSetup :
458
- if (mParams .GetThreadOperationalDataset ().HasValue () &&
459
- mDeviceCommissioningInfo .network .thread .endpoint != kInvalidEndpointId )
460
- {
461
- return CommissioningStage::kThreadNetworkSetup ;
462
- }
463
- else
464
- {
465
- return CommissioningStage::kFailsafeBeforeWiFiEnable ;
466
- }
474
+ return CommissioningStage::kFailsafeBeforeWiFiEnable ;
467
475
case CommissioningStage::kThreadNetworkSetup :
468
- if (mParams .GetWiFiCredentials ().HasValue () && mDeviceCommissioningInfo .network .wifi .endpoint != kInvalidEndpointId )
469
- {
470
- return CommissioningStage::kFailsafeBeforeWiFiEnable ;
471
- }
472
- else
473
- {
474
- return CommissioningStage::kFailsafeBeforeThreadEnable ;
475
- }
476
+ return CommissioningStage::kFailsafeBeforeThreadEnable ;
476
477
case CommissioningStage::kFailsafeBeforeWiFiEnable :
477
478
return CommissioningStage::kWiFiNetworkEnable ;
478
479
case CommissioningStage::kFailsafeBeforeThreadEnable :
479
480
return CommissioningStage::kThreadNetworkEnable ;
480
481
case CommissioningStage::kWiFiNetworkEnable :
481
- if (mParams .GetThreadOperationalDataset ().HasValue () &&
482
- mDeviceCommissioningInfo .network .thread .endpoint != kInvalidEndpointId )
483
- {
484
- return CommissioningStage::kThreadNetworkEnable ;
485
- }
486
- else if (mParams .GetSkipCommissioningComplete ().ValueOr (false ))
482
+ if (mParams .GetSkipCommissioningComplete ().ValueOr (false ))
487
483
{
488
484
SetCASEFailsafeTimerIfNeeded ();
489
485
return CommissioningStage::kCleanup ;
@@ -502,6 +498,10 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
502
498
return CommissioningStage::kEvictPreviousCaseSessions ;
503
499
case CommissioningStage::kEvictPreviousCaseSessions :
504
500
return CommissioningStage::kFindOperationalForStayActive ;
501
+ case CommissioningStage::kPrimaryOperationalNetworkFailed :
502
+ return CommissioningStage::kDisablePrimaryNetworkInterface ;
503
+ case CommissioningStage::kDisablePrimaryNetworkInterface :
504
+ return GetNextCommissioningStageNetworkSetup (currentStage, lastErr);
505
505
case CommissioningStage::kFindOperationalForStayActive :
506
506
return CommissioningStage::kICDSendStayActive ;
507
507
case CommissioningStage::kICDSendStayActive :
@@ -564,6 +564,8 @@ EndpointId AutoCommissioner::GetEndpoint(const CommissioningStage & stage) const
564
564
case CommissioningStage::kThreadNetworkSetup :
565
565
case CommissioningStage::kThreadNetworkEnable :
566
566
return mDeviceCommissioningInfo .network .thread .endpoint ;
567
+ case CommissioningStage::kDisablePrimaryNetworkInterface :
568
+ return kRootEndpointId ;
567
569
default :
568
570
return kRootEndpointId ;
569
571
}
@@ -729,6 +731,16 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
729
731
report.stageCompleted = CommissioningStage::kScanNetworks ;
730
732
}
731
733
}
734
+
735
+ if (err != CHIP_NO_ERROR && IsSecondaryNetworkSupported () && !IsTriedSecondaryNetwork () &&
736
+ completionStatus.failedStage .HasValue () && completionStatus.failedStage .Value () >= kWiFiNetworkSetup &&
737
+ completionStatus.failedStage .Value () <= kICDSendStayActive )
738
+ {
739
+ // Primary network failed, disable primary network interface and try secondary network interface.
740
+ SetTrySecondaryNetwork ();
741
+ err = CHIP_NO_ERROR;
742
+ report.stageCompleted = CommissioningStage::kPrimaryOperationalNetworkFailed ;
743
+ }
732
744
}
733
745
else
734
746
{
0 commit comments