@@ -46,8 +46,33 @@ namespace app {
46
46
namespace Clusters {
47
47
namespace CommissionerControl {
48
48
49
+ void CommissionerControlDelegate::ResetDelegateState ()
50
+ {
51
+ // Reset the step to the initial state
52
+ mNextStep = Step::kIdle ;
53
+
54
+ // Reset identifiers and product information
55
+ mRequestId = 0 ;
56
+ mClientNodeId = kUndefinedNodeId ;
57
+ mVendorId = VendorId::Unspecified;
58
+ mProductId = 0 ;
59
+
60
+ // Clear the label buffer and optional label
61
+ memset (mLabelBuffer , 0 , sizeof (mLabelBuffer ));
62
+ mLabel .ClearValue ();
63
+
64
+ // Reset PBKDF salt and PAKE passcode verifier buffers
65
+ mPBKDFSalt = ByteSpan ();
66
+ memset (mPBKDFSaltBuffer , 0 , sizeof (mPBKDFSaltBuffer ));
67
+
68
+ mPAKEPasscodeVerifier = ByteSpan ();
69
+ memset (mPAKEPasscodeVerifierBuffer , 0 , sizeof (mPAKEPasscodeVerifierBuffer ));
70
+ }
71
+
49
72
CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest (const CommissioningApprovalRequest & request)
50
73
{
74
+ VerifyOrReturnError (mNextStep == Step::kIdle , CHIP_ERROR_INCORRECT_STATE);
75
+
51
76
CommissionerControl::Events::CommissioningRequestResult::Type result;
52
77
result.requestId = request.requestId ;
53
78
result.clientNodeId = request.clientNodeId ;
@@ -86,19 +111,34 @@ CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest(const
86
111
mLabel .ClearValue ();
87
112
}
88
113
89
- return CommissionerControlServer::Instance ().GenerateCommissioningRequestResultEvent (result);
114
+ CHIP_ERROR err = CommissionerControlServer::Instance ().GenerateCommissioningRequestResultEvent (result);
115
+
116
+ if (err == CHIP_NO_ERROR)
117
+ {
118
+ mNextStep = Step::kWaitCommissionNodeRequest ;
119
+ }
120
+ else
121
+ {
122
+ ResetDelegateState ();
123
+ }
124
+
125
+ return err;
90
126
}
91
127
92
128
CHIP_ERROR CommissionerControlDelegate::ValidateCommissionNodeCommand (NodeId clientNodeId, uint64_t requestId)
93
129
{
94
130
CHIP_ERROR err = CHIP_NO_ERROR;
95
131
132
+ VerifyOrReturnError (mNextStep == Step::kWaitCommissionNodeRequest , CHIP_ERROR_INCORRECT_STATE);
133
+
96
134
// Verify if the CommissionNode command is sent from the same NodeId as the RequestCommissioningApproval.
97
135
VerifyOrExit (mClientNodeId == clientNodeId, err = CHIP_ERROR_WRONG_NODE_ID);
98
136
99
137
// Verify if the provided RequestId matches the value provided to the RequestCommissioningApproval.
100
138
VerifyOrExit (mRequestId == requestId, err = CHIP_ERROR_INCORRECT_STATE);
101
139
140
+ mNextStep = Step::kStartCommissionNode ;
141
+
102
142
exit :
103
143
return err;
104
144
}
@@ -129,20 +169,29 @@ CHIP_ERROR CommissionerControlDelegate::GetCommissioningWindowParams(Commissioni
129
169
CHIP_ERROR CommissionerControlDelegate::HandleCommissionNode (const CommissioningWindowParams & params,
130
170
const Optional<ByteSpan> & ipAddress, const Optional<uint16_t > & port)
131
171
{
172
+ CHIP_ERROR err = CHIP_NO_ERROR;
173
+
132
174
ChipLogProgress (NotSpecified, " CommissionerControlDelegate::HandleCommissionNode" );
133
175
176
+ VerifyOrReturnError (mNextStep == Step::kStartCommissionNode , CHIP_ERROR_INCORRECT_STATE);
177
+
134
178
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
135
- return CommissionNode (Controller::CommissioningWindowPasscodeParams ()
136
- .SetSetupPIN (kSetupPinCode )
137
- .SetTimeout (params.commissioningTimeout )
138
- .SetDiscriminator (params.discriminator )
139
- .SetIteration (params.iterations )
140
- .SetSalt (params.salt ),
141
- mVendorId , mProductId );
179
+ err = CommissionNode (Controller::CommissioningWindowPasscodeParams ()
180
+ .SetSetupPIN (kSetupPinCode )
181
+ .SetTimeout (params.commissioningTimeout )
182
+ .SetDiscriminator (params.discriminator )
183
+ .SetIteration (params.iterations )
184
+ .SetSalt (params.salt ),
185
+ mVendorId , mProductId );
142
186
#else
143
187
ChipLogProgress (NotSpecified, " Failed to reverse commission bridge: PW_RPC_FABRIC_BRIDGE_SERVICE not defined" );
144
- return CHIP_ERROR_NOT_IMPLEMENTED;
188
+ err = CHIP_ERROR_NOT_IMPLEMENTED;
145
189
#endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
190
+
191
+ // Reset the delegate's state to prepare for a new commissioning sequence.
192
+ ResetDelegateState ();
193
+
194
+ return err;
146
195
}
147
196
148
197
} // namespace CommissionerControl
0 commit comments