@@ -46,8 +46,33 @@ namespace app {
4646namespace Clusters {
4747namespace CommissionerControl {
4848
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+
4972CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest (const CommissioningApprovalRequest & request)
5073{
74+ VerifyOrReturnError (mNextStep == Step::kIdle , CHIP_ERROR_INCORRECT_STATE);
75+
5176 CommissionerControl::Events::CommissioningRequestResult::Type result;
5277 result.requestId = request.requestId ;
5378 result.clientNodeId = request.clientNodeId ;
@@ -86,19 +111,34 @@ CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest(const
86111 mLabel .ClearValue ();
87112 }
88113
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;
90126}
91127
92128CHIP_ERROR CommissionerControlDelegate::ValidateCommissionNodeCommand (NodeId clientNodeId, uint64_t requestId)
93129{
94130 CHIP_ERROR err = CHIP_NO_ERROR;
95131
132+ VerifyOrReturnError (mNextStep == Step::kWaitCommissionNodeRequest , CHIP_ERROR_INCORRECT_STATE);
133+
96134 // Verify if the CommissionNode command is sent from the same NodeId as the RequestCommissioningApproval.
97135 VerifyOrExit (mClientNodeId == clientNodeId, err = CHIP_ERROR_WRONG_NODE_ID);
98136
99137 // Verify if the provided RequestId matches the value provided to the RequestCommissioningApproval.
100138 VerifyOrExit (mRequestId == requestId, err = CHIP_ERROR_INCORRECT_STATE);
101139
140+ mNextStep = Step::kStartCommissionNode ;
141+
102142exit:
103143 return err;
104144}
@@ -129,20 +169,29 @@ CHIP_ERROR CommissionerControlDelegate::GetCommissioningWindowParams(Commissioni
129169CHIP_ERROR CommissionerControlDelegate::HandleCommissionNode (const CommissioningWindowParams & params,
130170 const Optional<ByteSpan> & ipAddress, const Optional<uint16_t > & port)
131171{
172+ CHIP_ERROR err = CHIP_NO_ERROR;
173+
132174 ChipLogProgress (NotSpecified, " CommissionerControlDelegate::HandleCommissionNode" );
133175
176+ VerifyOrReturnError (mNextStep == Step::kStartCommissionNode , CHIP_ERROR_INCORRECT_STATE);
177+
134178#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 );
142186#else
143187 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;
145189#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;
146195}
147196
148197} // namespace CommissionerControl
0 commit comments