Skip to content

Commit ad4cef6

Browse files
yufengwangcarestyled-commits
authored andcommittedSep 10, 2024
[Fabric-Bridge] Add state machine to CommissionerControlDelegate to guard various unexpected commands (project-chip#35186)
* Add state machine to CommissionerControlDelegate to guard various unexpected commands * Restyled by whitespace * Restyled by clang-format * Do not reset state when commissionNode fail to allow retry --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent 4e48bd3 commit ad4cef6

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed
 

‎examples/fabric-bridge-app/linux/CommissionerControl.cpp

+58-9
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,33 @@ namespace app {
4646
namespace Clusters {
4747
namespace 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+
4972
CHIP_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

92128
CHIP_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+
102142
exit:
103143
return err;
104144
}
@@ -129,20 +169,29 @@ CHIP_ERROR CommissionerControlDelegate::GetCommissioningWindowParams(Commissioni
129169
CHIP_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

‎examples/fabric-bridge-app/linux/include/CommissionerControl.h

+13
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,21 @@ class CommissionerControlDelegate : public Delegate
3838
~CommissionerControlDelegate() = default;
3939

4040
private:
41+
enum class Step : uint8_t
42+
{
43+
// Ready to start reverse commissioning.
44+
kIdle,
45+
// Wait for the commission node command.
46+
kWaitCommissionNodeRequest,
47+
// Need to commission node.
48+
kStartCommissionNode,
49+
};
50+
51+
void ResetDelegateState();
52+
4153
static constexpr size_t kLabelBufferSize = 64;
4254

55+
Step mNextStep = Step::kIdle;
4356
uint64_t mRequestId = 0;
4457
NodeId mClientNodeId = kUndefinedNodeId;
4558
VendorId mVendorId = VendorId::Unspecified;

0 commit comments

Comments
 (0)