Skip to content

Commit 369229d

Browse files
DejinChenshgutte
authored andcommittedSep 10, 2024
Auto-commissioner: remove primary network config if failed in commissioning SecondaryNetworkInterface device (project-chip#35255)
1 parent 0afdf12 commit 369229d

5 files changed

+53
-24
lines changed
 

‎src/controller/AutoCommissioner.cpp

+12-3
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,16 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
502502
case CommissioningStage::kEvictPreviousCaseSessions:
503503
return CommissioningStage::kFindOperationalForStayActive;
504504
case CommissioningStage::kPrimaryOperationalNetworkFailed:
505-
return CommissioningStage::kDisablePrimaryNetworkInterface;
506-
case CommissioningStage::kDisablePrimaryNetworkInterface:
505+
if (mDeviceCommissioningInfo.network.wifi.endpoint == kRootEndpointId)
506+
{
507+
return CommissioningStage::kRemoveWiFiNetworkConfig;
508+
}
509+
else
510+
{
511+
return CommissioningStage::kRemoveThreadNetworkConfig;
512+
}
513+
case CommissioningStage::kRemoveWiFiNetworkConfig:
514+
case CommissioningStage::kRemoveThreadNetworkConfig:
507515
return GetNextCommissioningStageNetworkSetup(currentStage, lastErr);
508516
case CommissioningStage::kFindOperationalForStayActive:
509517
return CommissioningStage::kICDSendStayActive;
@@ -567,7 +575,8 @@ EndpointId AutoCommissioner::GetEndpoint(const CommissioningStage & stage) const
567575
case CommissioningStage::kThreadNetworkSetup:
568576
case CommissioningStage::kThreadNetworkEnable:
569577
return mDeviceCommissioningInfo.network.thread.endpoint;
570-
case CommissioningStage::kDisablePrimaryNetworkInterface:
578+
case CommissioningStage::kRemoveWiFiNetworkConfig:
579+
case CommissioningStage::kRemoveThreadNetworkConfig:
571580
return kRootEndpointId;
572581
default:
573582
return kRootEndpointId;

‎src/controller/CHIPDeviceController.cpp

+32-14
Original file line numberDiff line numberDiff line change
@@ -1878,12 +1878,6 @@ void DeviceCommissioner::OnBasicSuccess(void * context, const chip::app::DataMod
18781878
commissioner->CommissioningStageComplete(CHIP_NO_ERROR);
18791879
}
18801880

1881-
void DeviceCommissioner::OnInterfaceEnableWriteSuccessResponse(void * context)
1882-
{
1883-
DeviceCommissioner * commissioner = static_cast<DeviceCommissioner *>(context);
1884-
commissioner->CommissioningStageComplete(CHIP_NO_ERROR);
1885-
}
1886-
18871881
void DeviceCommissioner::OnBasicFailure(void * context, CHIP_ERROR error)
18881882
{
18891883
ChipLogProgress(Controller, "Received failure response %s\n", chip::ErrorStr(error));
@@ -3536,19 +3530,43 @@ void DeviceCommissioner::PerformCommissioningStep(DeviceProxy * proxy, Commissio
35363530
}
35373531
break;
35383532
case CommissioningStage::kPrimaryOperationalNetworkFailed: {
3539-
// nothing to do. This stage indicates that the primary operational network failed and the network interface should be
3540-
// disabled later.
3533+
// nothing to do. This stage indicates that the primary operational network failed and the network config should be
3534+
// removed later.
35413535
break;
35423536
}
3543-
case CommissioningStage::kDisablePrimaryNetworkInterface: {
3544-
NetworkCommissioning::Attributes::InterfaceEnabled::TypeInfo::Type request = false;
3545-
CHIP_ERROR err = SendCommissioningWriteRequest(proxy, endpoint, NetworkCommissioning::Id,
3546-
NetworkCommissioning::Attributes::InterfaceEnabled::Id, request,
3547-
OnInterfaceEnableWriteSuccessResponse, OnBasicFailure);
3537+
case CommissioningStage::kRemoveWiFiNetworkConfig: {
3538+
NetworkCommissioning::Commands::RemoveNetwork::Type request;
3539+
request.networkID = params.GetWiFiCredentials().Value().ssid;
3540+
request.breadcrumb.Emplace(breadcrumb);
3541+
CHIP_ERROR err = SendCommissioningCommand(proxy, request, OnNetworkConfigResponse, OnBasicFailure, endpoint, timeout);
3542+
if (err != CHIP_NO_ERROR)
3543+
{
3544+
// We won't get any async callbacks here, so just complete our stage.
3545+
ChipLogError(Controller, "Failed to send RemoveNetwork command: %" CHIP_ERROR_FORMAT, err.Format());
3546+
CommissioningStageComplete(err);
3547+
return;
3548+
}
3549+
break;
3550+
}
3551+
case CommissioningStage::kRemoveThreadNetworkConfig: {
3552+
ByteSpan extendedPanId;
3553+
chip::Thread::OperationalDataset operationalDataset;
3554+
if (!params.GetThreadOperationalDataset().HasValue() ||
3555+
operationalDataset.Init(params.GetThreadOperationalDataset().Value()) != CHIP_NO_ERROR ||
3556+
operationalDataset.GetExtendedPanIdAsByteSpan(extendedPanId) != CHIP_NO_ERROR)
3557+
{
3558+
ChipLogError(Controller, "Unable to get extended pan ID for thread operational dataset\n");
3559+
CommissioningStageComplete(CHIP_ERROR_INVALID_ARGUMENT);
3560+
return;
3561+
}
3562+
NetworkCommissioning::Commands::RemoveNetwork::Type request;
3563+
request.networkID = extendedPanId;
3564+
request.breadcrumb.Emplace(breadcrumb);
3565+
CHIP_ERROR err = SendCommissioningCommand(proxy, request, OnNetworkConfigResponse, OnBasicFailure, endpoint, timeout);
35483566
if (err != CHIP_NO_ERROR)
35493567
{
35503568
// We won't get any async callbacks here, so just complete our stage.
3551-
ChipLogError(Controller, "Failed to send InterfaceEnabled write request: %" CHIP_ERROR_FORMAT, err.Format());
3569+
ChipLogError(Controller, "Failed to send RemoveNetwork command: %" CHIP_ERROR_FORMAT, err.Format());
35523570
CommissioningStageComplete(err);
35533571
return;
35543572
}

‎src/controller/CHIPDeviceController.h

-2
Original file line numberDiff line numberDiff line change
@@ -980,8 +980,6 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
980980
OnICDManagementStayActiveResponse(void * context,
981981
const app::Clusters::IcdManagement::Commands::StayActiveResponse::DecodableType & data);
982982

983-
static void OnInterfaceEnableWriteSuccessResponse(void * context);
984-
985983
/**
986984
* @brief
987985
* This function processes the CSR sent by the device.

‎src/controller/CommissioningDelegate.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,11 @@ const char * StageToString(CommissioningStage stage)
139139
case kPrimaryOperationalNetworkFailed:
140140
return "PrimaryOperationalNetworkFailed";
141141

142-
case kDisablePrimaryNetworkInterface:
143-
return "DisablePrimaryNetworkInterface";
142+
case kRemoveWiFiNetworkConfig:
143+
return "RemoveWiFiNetworkConfig";
144+
145+
case kRemoveThreadNetworkConfig:
146+
return "RemoveThreadNetworkConfig";
144147

145148
default:
146149
return "???";

‎src/controller/CommissioningDelegate.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,10 @@ enum CommissioningStage : uint8_t
7979
/// Call CHIPDeviceController::NetworkCredentialsReady() when CommissioningParameters is populated with
8080
/// network credentials to use in kWiFiNetworkSetup or kThreadNetworkSetup steps.
8181
kNeedsNetworkCreds,
82-
kPrimaryOperationalNetworkFailed, ///< Indicate that the primary operational network (on root endpoint) failed, should disable
83-
///< the primary network interface later.
84-
kDisablePrimaryNetworkInterface, ///< Send InterfaceEnabled write request to the device to disable network interface.
82+
kPrimaryOperationalNetworkFailed, ///< Indicate that the primary operational network (on root endpoint) failed, should remove
83+
///< the primary network config later.
84+
kRemoveWiFiNetworkConfig, ///< Remove Wi-Fi network config.
85+
kRemoveThreadNetworkConfig ///< Remove Thread network config.
8586
};
8687

8788
enum class ICDRegistrationStrategy : uint8_t

0 commit comments

Comments
 (0)