|
36 | 36 | #include <app/server/Dnssd.h>
|
37 | 37 | #include <controller/CurrentFabricRemover.h>
|
38 | 38 | #include <controller/InvokeInteraction.h>
|
| 39 | +#include <controller/WriteInteraction.h> |
39 | 40 | #include <credentials/CHIPCert.h>
|
40 | 41 | #include <credentials/DeviceAttestationCredsProvider.h>
|
41 | 42 | #include <crypto/CHIPCryptoPAL.h>
|
@@ -1028,6 +1029,12 @@ void DeviceCommissioner::CancelCommissioningInteractions()
|
1028 | 1029 | mInvokeCancelFn();
|
1029 | 1030 | mInvokeCancelFn = nullptr;
|
1030 | 1031 | }
|
| 1032 | + if (mWriteCancelFn) |
| 1033 | + { |
| 1034 | + ChipLogDetail(Controller, "Cancelling write request for step '%s'", StageToString(mCommissioningStage)); |
| 1035 | + mWriteCancelFn(); |
| 1036 | + mWriteCancelFn = nullptr; |
| 1037 | + } |
1031 | 1038 | if (mOnDeviceConnectedCallback.IsRegistered())
|
1032 | 1039 | {
|
1033 | 1040 | ChipLogDetail(Controller, "Cancelling CASE setup for step '%s'", StageToString(mCommissioningStage));
|
@@ -1800,6 +1807,12 @@ void DeviceCommissioner::OnBasicSuccess(void * context, const chip::app::DataMod
|
1800 | 1807 | commissioner->CommissioningStageComplete(CHIP_NO_ERROR);
|
1801 | 1808 | }
|
1802 | 1809 |
|
| 1810 | +void DeviceCommissioner::OnInterfaceEnableWriteSuccessResponse(void * context) |
| 1811 | +{ |
| 1812 | + DeviceCommissioner * commissioner = static_cast<DeviceCommissioner *>(context); |
| 1813 | + commissioner->CommissioningStageComplete(CHIP_NO_ERROR); |
| 1814 | +} |
| 1815 | + |
1803 | 1816 | void DeviceCommissioner::OnBasicFailure(void * context, CHIP_ERROR error)
|
1804 | 1817 | {
|
1805 | 1818 | ChipLogProgress(Controller, "Received failure response %s\n", chip::ErrorStr(error));
|
@@ -1971,6 +1984,7 @@ void DeviceCommissioner::CommissioningStageComplete(CHIP_ERROR err, Commissionin
|
1971 | 1984 | DeviceProxy * proxy = mDeviceBeingCommissioned;
|
1972 | 1985 | mDeviceBeingCommissioned = nullptr;
|
1973 | 1986 | mInvokeCancelFn = nullptr;
|
| 1987 | + mWriteCancelFn = nullptr; |
1974 | 1988 |
|
1975 | 1989 | if (mPairingDelegate != nullptr)
|
1976 | 1990 | {
|
@@ -2739,6 +2753,20 @@ DeviceCommissioner::SendCommissioningCommand(DeviceProxy * device, const Request
|
2739 | 2753 | onFailureCb, NullOptional, timeout, (!fireAndForget) ? &mInvokeCancelFn : nullptr);
|
2740 | 2754 | }
|
2741 | 2755 |
|
| 2756 | +template <typename AttrType> |
| 2757 | +CHIP_ERROR DeviceCommissioner::SendCommissioningWriteRequest(DeviceProxy * device, EndpointId endpoint, ClusterId cluster, |
| 2758 | + AttributeId attribute, const AttrType & requestData, |
| 2759 | + WriteResponseSuccessCallback successCb, |
| 2760 | + WriteResponseFailureCallback failureCb) |
| 2761 | +{ |
| 2762 | + VerifyOrDie(!mWriteCancelFn); // we don't make parallel (cancellable) calls |
| 2763 | + auto onSuccessCb = [this, successCb](const app::ConcreteAttributePath & aPath) { successCb(this); }; |
| 2764 | + auto onFailureCb = [this, failureCb](const app::ConcreteAttributePath * aPath, CHIP_ERROR aError) { failureCb(this, aError); }; |
| 2765 | + return WriteAttribute(device->GetSecureSession().Value(), endpoint, cluster, attribute, requestData, onSuccessCb, onFailureCb, |
| 2766 | + /* aTimedWriteTimeoutMs = */ NullOptional, /* onDoneCb = */ nullptr, /* aDataVersion = */ NullOptional, |
| 2767 | + /* outCancelFn = */ &mWriteCancelFn); |
| 2768 | +} |
| 2769 | + |
2742 | 2770 | void DeviceCommissioner::SendCommissioningReadRequest(DeviceProxy * proxy, Optional<System::Clock::Timeout> timeout,
|
2743 | 2771 | app::AttributePathParams * readPaths, size_t readPathsSize)
|
2744 | 2772 | {
|
@@ -3423,6 +3451,25 @@ void DeviceCommissioner::PerformCommissioningStep(DeviceProxy * proxy, Commissio
|
3423 | 3451 | );
|
3424 | 3452 | }
|
3425 | 3453 | break;
|
| 3454 | + case CommissioningStage::kPrimaryOperationalNetworkFailed: { |
| 3455 | + // nothing to do. This stage indicates that the primary operational network failed and the network interface should be |
| 3456 | + // disabled later. |
| 3457 | + break; |
| 3458 | + } |
| 3459 | + case CommissioningStage::kDisablePrimaryNetworkInterface: { |
| 3460 | + NetworkCommissioning::Attributes::InterfaceEnabled::TypeInfo::Type request = false; |
| 3461 | + CHIP_ERROR err = SendCommissioningWriteRequest(proxy, endpoint, NetworkCommissioning::Id, |
| 3462 | + NetworkCommissioning::Attributes::InterfaceEnabled::Id, request, |
| 3463 | + OnInterfaceEnableWriteSuccessResponse, OnBasicFailure); |
| 3464 | + if (err != CHIP_NO_ERROR) |
| 3465 | + { |
| 3466 | + // We won't get any async callbacks here, so just complete our stage. |
| 3467 | + ChipLogError(Controller, "Failed to send InterfaceEnabled write request: %" CHIP_ERROR_FORMAT, err.Format()); |
| 3468 | + CommissioningStageComplete(err); |
| 3469 | + return; |
| 3470 | + } |
| 3471 | + break; |
| 3472 | + } |
3426 | 3473 | case CommissioningStage::kICDSendStayActive: {
|
3427 | 3474 | if (!(params.GetICDStayActiveDurationMsec().HasValue()))
|
3428 | 3475 | {
|
|
0 commit comments