Skip to content

Commit 1089ce3

Browse files
Use CHIP_ERROR_BUFFER_TOO_SMALL, Avoid SuccessOrExit, args for example
Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent 7e80407 commit 1089ce3

File tree

3 files changed

+46
-45
lines changed

3 files changed

+46
-45
lines changed

examples/fabric-bridge-app/linux/RpcClient.cpp

+14-21
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,9 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort)
6363
return rpc::client::StartPacketProcessing();
6464
}
6565

66-
CHIP_ERROR OpenCommissioningWindow(NodeId nodeId, uint16_t commissioningTimeout, uint16_t discriminator, uint32_t iterations,
67-
chip::Optional<chip::ByteSpan> salt, chip::Optional<chip::ByteSpan> verifier)
66+
CHIP_ERROR OpenCommissioningWindow(CommissioningWindowParams params)
6867
{
69-
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x:" ChipLogFormatX64, ChipLogValueX64(nodeId));
68+
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x:" ChipLogFormatX64, ChipLogValueX64(params.nodeId));
7069

7170
if (openCommissioningWindowCall.active())
7271
{
@@ -75,29 +74,23 @@ CHIP_ERROR OpenCommissioningWindow(NodeId nodeId, uint16_t commissioningTimeout,
7574
}
7675

7776
chip_rpc_DeviceCommissioningWindowInfo device;
78-
device.node_id = nodeId;
79-
device.commissioning_timeout = commissioningTimeout;
80-
device.discriminator = discriminator;
81-
device.iterations = iterations;
77+
device.node_id = params.nodeId;
78+
device.commissioning_timeout = params.commissioningTimeout;
79+
device.discriminator = params.discriminator;
80+
device.iterations = params.iterations;
8281

83-
if (salt.HasValue())
82+
if (params.salt.HasValue())
8483
{
85-
if (salt.Value().size() > sizeof(device.salt.bytes))
86-
{
87-
return CHIP_ERROR_INTERNAL;
88-
}
89-
memcpy(device.salt.bytes, salt.Value().data(), salt.Value().size());
90-
device.salt.size = static_cast<size_t>(salt.Value().size());
84+
VerifyOrReturnError(params.salt.Value().size() <= sizeof(device.salt.bytes), CHIP_ERROR_BUFFER_TOO_SMALL);
85+
memcpy(device.salt.bytes, params.salt.Value().data(), params.salt.Value().size());
86+
device.salt.size = static_cast<size_t>(params.salt.Value().size());
9187
}
9288

93-
if (verifier.HasValue())
89+
if (params.verifier.HasValue())
9490
{
95-
if (verifier.Value().size() > sizeof(device.verifier.bytes))
96-
{
97-
return CHIP_ERROR_INTERNAL;
98-
}
99-
memcpy(device.verifier.bytes, verifier.Value().data(), verifier.Value().size());
100-
device.verifier.size = static_cast<size_t>(verifier.Value().size());
91+
VerifyOrReturnError(params.verifier.Value().size() <= sizeof(device.verifier.bytes), CHIP_ERROR_BUFFER_TOO_SMALL);
92+
memcpy(device.verifier.bytes, params.verifier.Value().data(), params.verifier.Value().size());
93+
device.verifier.size = static_cast<size_t>(params.verifier.Value().size());
10194
}
10295

10396
// The RPC will remain active as long as `openCommissioningWindowCall` is alive.

examples/fabric-bridge-app/linux/include/RpcClient.h

+13-3
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,24 @@ constexpr uint16_t kFabricAdminServerPort = 33001;
3232
*/
3333
CHIP_ERROR InitRpcClient(uint16_t rpcServerPort);
3434

35+
struct CommissioningWindowParams
36+
{
37+
chip::NodeId nodeId;
38+
uint16_t commissioningTimeout;
39+
uint16_t discriminator;
40+
uint32_t iterations;
41+
chip::Optional<chip::ByteSpan> salt = chip::NullOptional;
42+
chip::Optional<chip::ByteSpan> verifier = chip::NullOptional;
43+
};
44+
3545
/**
3646
* Opens a commissioning window for a specified node.
3747
*
38-
* @param nodeId The identifier of the node for which the commissioning window should be opened.
48+
* @param params Params for opening the commissioning window on given node.
3949
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
4050
* - CHIP_NO_ERROR: The RPC command was successfully sent.
4151
* - CHIP_ERROR_BUSY: Another commissioning window is currently in progress.
4252
* - CHIP_ERROR_INTERNAL: An internal error occurred.
4353
*/
44-
CHIP_ERROR OpenCommissioningWindow(chip::NodeId nodeId, uint16_t commissioningTimeout, uint16_t discriminator, uint32_t iterations,
45-
chip::Optional<chip::ByteSpan> salt, chip::Optional<chip::ByteSpan> verifier);
54+
CHIP_ERROR
55+
OpenCommissioningWindow(CommissioningWindowParams params);

examples/fabric-bridge-app/linux/main.cpp

+19-21
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ void BridgePollingThread()
7474
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
7575
else if (ch == 'o')
7676
{
77-
CHIP_ERROR err = OpenCommissioningWindow(0x1234, 300, 3840, 1000, chip::NullOptional, chip::NullOptional);
77+
CommissioningWindowParams params = {
78+
.nodeId = 0x1234, .commissioningTimeout = 300, .discriminator = 3840, .iterations = 1000
79+
};
80+
CHIP_ERROR err = OpenCommissioningWindow(params);
7881
if (err != CHIP_NO_ERROR)
7982
{
8083
ChipLogError(NotSpecified, "Failed to call OpenCommissioningWindow RPC: %" CHIP_ERROR_FORMAT, err.Format());
@@ -130,31 +133,27 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
130133

131134
handlerContext.SetCommandHandled();
132135

133-
uint16_t commissioningTimeout;
134-
uint16_t discriminator;
135-
uint32_t iterations;
136-
chip::Optional<chip::ByteSpan> salt;
137-
chip::Optional<chip::ByteSpan> verifier;
138-
Device * device = nullptr;
139-
Status status = Status::Failure;
140-
141136
Commands::OpenCommissioningWindow::DecodableType commandData;
142-
CHIP_ERROR tlvError = DataModel::Decode(handlerContext.mPayload, commandData);
143-
SuccessOrExit(tlvError);
137+
if (DataModel::Decode(handlerContext.mPayload, commandData) != CHIP_NO_ERROR)
138+
{
139+
handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, Status::InvalidCommand);
140+
return;
141+
}
144142

145-
commissioningTimeout = commandData.commissioningTimeout;
146-
discriminator = commandData.discriminator;
147-
iterations = commandData.iterations;
148-
salt = chip::Optional<chip::ByteSpan>(commandData.salt);
149-
verifier = chip::Optional<chip::ByteSpan>(commandData.PAKEPasscodeVerifier);
143+
Status status = Status::Failure;
150144

151145
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
152-
device = DeviceMgr().GetDevice(endpointId);
146+
Device * device = DeviceMgr().GetDevice(endpointId);
147+
148+
CommissioningWindowParams params = { .nodeId = device->GetNodeId(),
149+
.commissioningTimeout = commandData.commissioningTimeout,
150+
.discriminator = commandData.discriminator,
151+
.iterations = commandData.iterations,
152+
.salt = chip::Optional<chip::ByteSpan>(commandData.salt),
153+
.verifier = chip::Optional<chip::ByteSpan>(commandData.PAKEPasscodeVerifier) };
153154

154155
// TODO: issues:#33784, need to make OpenCommissioningWindow synchronous
155-
if (device != nullptr &&
156-
OpenCommissioningWindow(device->GetNodeId(), commissioningTimeout, discriminator, iterations, salt, verifier) ==
157-
CHIP_NO_ERROR)
156+
if (device != nullptr && OpenCommissioningWindow(params) == CHIP_NO_ERROR)
158157
{
159158
ChipLogProgress(NotSpecified, "Commissioning window is now open");
160159
status = Status::Success;
@@ -167,7 +166,6 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
167166
ChipLogProgress(NotSpecified, "Commissioning window failed to open: PW_RPC_FABRIC_BRIDGE_SERVICE not defined");
168167
#endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
169168

170-
exit:
171169
handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status);
172170
}
173171

0 commit comments

Comments
 (0)