Skip to content

Commit 718b40d

Browse files
Use fluent builder pattern for OCW params, and some fixes
Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent 1089ce3 commit 718b40d

File tree

10 files changed

+308
-186
lines changed

10 files changed

+308
-186
lines changed

examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.cpp

+7-11
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,13 @@ CHIP_ERROR OpenCommissioningWindowCommand::RunCommand()
3434
if (mCommissioningWindowOption == Controller::CommissioningWindowOpener::CommissioningWindowOption::kTokenWithRandomPIN)
3535
{
3636
SetupPayload ignored;
37-
Controller::CommissioningWindowOpener::CommissioningWindowPasscodeParams params = {
38-
.common = { .deviceId = mNodeId,
39-
.timeout = System::Clock::Seconds16(mCommissioningWindowTimeout),
40-
.iteration = mIteration,
41-
.discriminator = mDiscriminator },
42-
.setupPIN = NullOptional,
43-
.salt = NullOptional,
44-
.readVIDPIDAttributes = true,
45-
.callback = &mOnOpenCommissioningWindowCallback,
46-
};
47-
return mWindowOpener->OpenCommissioningWindow(params, ignored);
37+
return mWindowOpener->OpenCommissioningWindow(Controller::CommissioningWindowPasscodeParams()
38+
.SetNodeId(mNodeId)
39+
.SetTimeout(mCommissioningWindowTimeout)
40+
.SetIteration(mIteration)
41+
.SetDiscriminator(mDiscriminator)
42+
.SetReadVIDPIDAttributes(true),
43+
&mOnOpenCommissioningWindowCallback, ignored);
4844
}
4945

5046
ChipLogError(chipTool, "Unknown commissioning window option: %d", to_underlying(mCommissioningWindowOption));

examples/fabric-admin/commands/pairing/OpenCommissioningWindowCommand.cpp

+16-21
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,29 @@ CHIP_ERROR OpenCommissioningWindowCommand::RunCommand()
3333

3434
if (mCommissioningWindowOption == Controller::CommissioningWindowOpener::CommissioningWindowOption::kTokenWithRandomPIN)
3535
{
36-
Controller::CommissioningWindowOpener::CommissioningWindowCommonParams common = { .deviceId = mNodeId,
37-
.timeout = System::Clock::Seconds16(
38-
mCommissioningWindowTimeout),
39-
.iteration = mIteration,
40-
.discriminator = mDiscriminator };
41-
4236
if (mVerifier.HasValue())
4337
{
4438
VerifyOrReturnError(mSalt.HasValue(), CHIP_ERROR_INVALID_ARGUMENT);
45-
Controller::CommissioningWindowOpener::CommissioningWindowVerifierParams params = {
46-
.common = common,
47-
.verifier = mVerifier.Value(),
48-
.salt = mSalt.Value(),
49-
.callback = &mOnOpenCommissioningWindowVerifierCallback,
50-
};
51-
return mWindowOpener->OpenCommissioningWindow(params);
39+
return mWindowOpener->OpenCommissioningWindow(Controller::CommissioningWindowVerifierParams()
40+
.SetNodeId(mNodeId)
41+
.SetTimeout(mCommissioningWindowTimeout)
42+
.SetIteration(mIteration)
43+
.SetDiscriminator(mDiscriminator)
44+
.SetVerifier(mVerifier.Value())
45+
.SetSalt(mSalt.Value()),
46+
&mOnOpenCommissioningWindowVerifierCallback);
5247
}
5348
else
5449
{
5550
SetupPayload ignored;
56-
Controller::CommissioningWindowOpener::CommissioningWindowPasscodeParams params = {
57-
.common = common,
58-
.setupPIN = NullOptional,
59-
.salt = mSalt,
60-
.readVIDPIDAttributes = true,
61-
.callback = &mOnOpenCommissioningWindowCallback,
62-
};
63-
return mWindowOpener->OpenCommissioningWindow(params, ignored);
51+
return mWindowOpener->OpenCommissioningWindow(Controller::CommissioningWindowPasscodeParams()
52+
.SetNodeId(mNodeId)
53+
.SetTimeout(mCommissioningWindowTimeout)
54+
.SetIteration(mIteration)
55+
.SetDiscriminator(mDiscriminator)
56+
.SetSalt(mSalt)
57+
.SetReadVIDPIDAttributes(true),
58+
&mOnOpenCommissioningWindowCallback, ignored);
6459
}
6560
}
6661

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

+34-22
Original file line numberDiff line numberDiff line change
@@ -63,36 +63,16 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort)
6363
return rpc::client::StartPacketProcessing();
6464
}
6565

66-
CHIP_ERROR OpenCommissioningWindow(CommissioningWindowParams params)
66+
CHIP_ERROR OpenCommissioningWindow(chip_rpc_DeviceCommissioningWindowInfo device)
6767
{
68-
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x:" ChipLogFormatX64, ChipLogValueX64(params.nodeId));
68+
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x" ChipLogFormatX64, ChipLogValueX64(device.node_id));
6969

7070
if (openCommissioningWindowCall.active())
7171
{
7272
ChipLogError(NotSpecified, "OpenCommissioningWindow is in progress\n");
7373
return CHIP_ERROR_BUSY;
7474
}
7575

76-
chip_rpc_DeviceCommissioningWindowInfo device;
77-
device.node_id = params.nodeId;
78-
device.commissioning_timeout = params.commissioningTimeout;
79-
device.discriminator = params.discriminator;
80-
device.iterations = params.iterations;
81-
82-
if (params.salt.HasValue())
83-
{
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());
87-
}
88-
89-
if (params.verifier.HasValue())
90-
{
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());
94-
}
95-
9676
// The RPC will remain active as long as `openCommissioningWindowCall` is alive.
9777
openCommissioningWindowCall = fabricAdminClient.OpenCommissioningWindow(device, OnOpenCommissioningWindowCompleted);
9878

@@ -103,3 +83,35 @@ CHIP_ERROR OpenCommissioningWindow(CommissioningWindowParams params)
10383

10484
return CHIP_NO_ERROR;
10585
}
86+
87+
CHIP_ERROR
88+
OpenCommissioningWindow(chip::Controller::CommissioningWindowPasscodeParams params)
89+
{
90+
chip_rpc_DeviceCommissioningWindowInfo device;
91+
device.node_id = params.GetNodeId();
92+
device.commissioning_timeout = params.GetTimeout().count();
93+
device.discriminator = params.GetDiscriminator();
94+
device.iterations = params.GetIteration();
95+
96+
return OpenCommissioningWindow(device);
97+
}
98+
99+
CHIP_ERROR
100+
OpenCommissioningWindow(chip::Controller::CommissioningWindowVerifierParams params)
101+
{
102+
chip_rpc_DeviceCommissioningWindowInfo device;
103+
device.node_id = params.GetNodeId();
104+
device.commissioning_timeout = params.GetTimeout().count();
105+
device.discriminator = params.GetDiscriminator();
106+
device.iterations = params.GetIteration();
107+
108+
VerifyOrReturnError(params.GetSalt().size() <= sizeof(device.salt.bytes), CHIP_ERROR_BUFFER_TOO_SMALL);
109+
memcpy(device.salt.bytes, params.GetSalt().data(), params.GetSalt().size());
110+
device.salt.size = static_cast<size_t>(params.GetSalt().size());
111+
112+
VerifyOrReturnError(params.GetVerifier().size() <= sizeof(device.verifier.bytes), CHIP_ERROR_BUFFER_TOO_SMALL);
113+
memcpy(device.verifier.bytes, params.GetVerifier().data(), params.GetVerifier().size());
114+
device.verifier.size = static_cast<size_t>(params.GetVerifier().size());
115+
116+
return OpenCommissioningWindow(device);
117+
}

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

+15-12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#pragma once
2020

21+
#include <controller/CommissioningWindowParams.h>
2122
#include <platform/CHIPDeviceLayer.h>
2223

2324
constexpr uint16_t kFabricAdminServerPort = 33001;
@@ -32,24 +33,26 @@ constexpr uint16_t kFabricAdminServerPort = 33001;
3233
*/
3334
CHIP_ERROR InitRpcClient(uint16_t rpcServerPort);
3435

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-
};
36+
/**
37+
* Opens a commissioning window for a specified node using setup PIN (passcode).
38+
*
39+
* @param params Params for opening the commissioning window using passcode.
40+
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
41+
* - CHIP_NO_ERROR: The RPC command was successfully sent.
42+
* - CHIP_ERROR_BUSY: Another commissioning window is currently in progress.
43+
* - CHIP_ERROR_INTERNAL: An internal error occurred.
44+
*/
45+
CHIP_ERROR
46+
OpenCommissioningWindow(chip::Controller::CommissioningWindowPasscodeParams params);
4447

4548
/**
46-
* Opens a commissioning window for a specified node.
49+
* Opens a commissioning window for a specified node using pre-computed PAKE passcode verifier.
4750
*
48-
* @param params Params for opening the commissioning window on given node.
51+
* @param params Params for opening the commissioning window using verifier.
4952
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
5053
* - CHIP_NO_ERROR: The RPC command was successfully sent.
5154
* - CHIP_ERROR_BUSY: Another commissioning window is currently in progress.
5255
* - CHIP_ERROR_INTERNAL: An internal error occurred.
5356
*/
5457
CHIP_ERROR
55-
OpenCommissioningWindow(CommissioningWindowParams params);
58+
OpenCommissioningWindow(chip::Controller::CommissioningWindowVerifierParams params);

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

+14-13
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,11 @@ void BridgePollingThread()
7474
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
7575
else if (ch == 'o')
7676
{
77-
CommissioningWindowParams params = {
78-
.nodeId = 0x1234, .commissioningTimeout = 300, .discriminator = 3840, .iterations = 1000
79-
};
80-
CHIP_ERROR err = OpenCommissioningWindow(params);
77+
CHIP_ERROR err = OpenCommissioningWindow(chip::Controller::CommissioningWindowPasscodeParams()
78+
.SetNodeId(0x1234)
79+
.SetTimeout(300)
80+
.SetDiscriminator(3840)
81+
.SetIteration(1000));
8182
if (err != CHIP_NO_ERROR)
8283
{
8384
ChipLogError(NotSpecified, "Failed to call OpenCommissioningWindow RPC: %" CHIP_ERROR_FORMAT, err.Format());
@@ -123,7 +124,7 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
123124
using Protocols::InteractionModel::Status;
124125

125126
EndpointId endpointId = handlerContext.mRequestPath.mEndpointId;
126-
ChipLogProgress(NotSpecified, "Received command to open commissioning window on Endpoind: %d", endpointId);
127+
ChipLogProgress(NotSpecified, "Received command to open commissioning window on Endpoint: %d", endpointId);
127128

128129
if (handlerContext.mRequestPath.mCommandId != Commands::OpenCommissioningWindow::Id || endpointId == kRootEndpointId)
129130
{
@@ -145,15 +146,15 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
145146
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
146147
Device * device = DeviceMgr().GetDevice(endpointId);
147148

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) };
154-
155149
// TODO: issues:#33784, need to make OpenCommissioningWindow synchronous
156-
if (device != nullptr && OpenCommissioningWindow(params) == CHIP_NO_ERROR)
150+
if (device != nullptr &&
151+
OpenCommissioningWindow(chip::Controller::CommissioningWindowVerifierParams()
152+
.SetNodeId(device->GetNodeId())
153+
.SetTimeout(commandData.commissioningTimeout)
154+
.SetDiscriminator(commandData.discriminator)
155+
.SetIteration(commandData.iterations)
156+
.SetSalt(commandData.salt)
157+
.SetVerifier(commandData.PAKEPasscodeVerifier)) == CHIP_NO_ERROR)
157158
{
158159
ChipLogProgress(NotSpecified, "Commissioning window is now open");
159160
status = Status::Success;

src/controller/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ static_library("controller") {
7474
"CommandSenderAllocator.h",
7575
"CommissioneeDeviceProxy.h",
7676
"CommissioningDelegate.h",
77+
"CommissioningWindowParams.h",
7778
"DeviceDiscoveryDelegate.h",
7879
"DevicePairingDelegate.h",
7980
"InvokeInteraction.h",

0 commit comments

Comments
 (0)