Skip to content

Commit e0fc29a

Browse files
authored
[Fabric-Sync]: Convert ember-driven functions to interface functions (project-chip#36659)
* [Fabric-Sync]: Convert ember-driven functions to interface functions * Address review comments
1 parent 0495a4e commit e0fc29a

File tree

8 files changed

+143
-109
lines changed

8 files changed

+143
-109
lines changed

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest(const
116116
mLabel.ClearValue();
117117
}
118118

119-
CHIP_ERROR err = CommissionerControlServer::Instance().GenerateCommissioningRequestResultEvent(kAggregatorEndpointId, result);
119+
CHIP_ERROR err = mCommissionerControlServer.GenerateCommissioningRequestResultEvent(kAggregatorEndpointId, result);
120120

121121
if (err == CHIP_NO_ERROR)
122122
{
@@ -228,7 +228,7 @@ CHIP_ERROR CommissionerControlInit()
228228
return CHIP_ERROR_NO_MEMORY;
229229
}
230230

231-
err = Clusters::CommissionerControl::CommissionerControlServer::Instance().Init(*sCommissionerControlDelegate);
231+
err = sCommissionerControlDelegate->GetCommissionerControlServer().Init();
232232
if (err != CHIP_NO_ERROR)
233233
{
234234
ChipLogError(AppServer, "Initialization failed on Commissioner Control Delegate.");
@@ -242,7 +242,7 @@ CHIP_ERROR CommissionerControlInit()
242242
supportedDeviceCategories.SetField(Clusters::CommissionerControl::SupportedDeviceCategoryBitmap::kFabricSynchronization, 1);
243243

244244
Protocols::InteractionModel::Status status =
245-
Clusters::CommissionerControl::CommissionerControlServer::Instance().SetSupportedDeviceCategoriesValue(
245+
sCommissionerControlDelegate->GetCommissionerControlServer().SetSupportedDeviceCategoriesValue(
246246
Clusters::CommissionerControl::kAggregatorEndpointId, supportedDeviceCategories);
247247

248248
if (status != Protocols::InteractionModel::Status::Success)

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

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ inline constexpr EndpointId kAggregatorEndpointId = 1;
3131
class CommissionerControlDelegate : public Delegate
3232
{
3333
public:
34+
CommissionerControlDelegate() : mCommissionerControlServer(this, kAggregatorEndpointId, CommissionerControl::Id) {}
35+
3436
CHIP_ERROR HandleCommissioningApprovalRequest(const CommissioningApprovalRequest & request) override;
3537
// TODO(#35627) clientNodeId should move towards ScopedNodeId.
3638
CHIP_ERROR ValidateCommissionNodeCommand(NodeId clientNodeId, uint64_t requestId) override;
@@ -39,6 +41,8 @@ class CommissionerControlDelegate : public Delegate
3941

4042
~CommissionerControlDelegate() = default;
4143

44+
CommissionerControlServer & GetCommissionerControlServer() { return mCommissionerControlServer; }
45+
4246
private:
4347
enum class Step : uint8_t
4448
{
@@ -82,6 +86,8 @@ class CommissionerControlDelegate : public Delegate
8286
ByteSpan mPBKDFSalt;
8387
Crypto::Spake2pVerifierSerialized mPAKEPasscodeVerifierBuffer;
8488
ByteSpan mPAKEPasscodeVerifier;
89+
90+
CommissionerControlServer mCommissionerControlServer;
8591
};
8692

8793
} // namespace CommissionerControl

examples/fabric-sync/bridge/include/CommissionerControlDelegate.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ inline constexpr EndpointId kAggregatorEndpointId = 1;
3232
class CommissionerControlDelegate : public Delegate
3333
{
3434
public:
35-
CommissionerControlDelegate(bridge::FabricAdminDelegate * fabricAdmin) : mFabricAdmin(fabricAdmin) {}
35+
CommissionerControlDelegate(bridge::FabricAdminDelegate * fabricAdmin) :
36+
mFabricAdmin(fabricAdmin), mCommissionerControlServer(this, kAggregatorEndpointId, CommissionerControl::Id)
37+
{}
3638

3739
CHIP_ERROR HandleCommissioningApprovalRequest(const CommissioningApprovalRequest & request) override;
3840
// TODO(#35627) clientNodeId should move towards ScopedNodeId.
@@ -42,6 +44,8 @@ class CommissionerControlDelegate : public Delegate
4244

4345
~CommissionerControlDelegate() = default;
4446

47+
CommissionerControlServer & GetCommissionerControlServer() { return mCommissionerControlServer; }
48+
4549
private:
4650
enum class Step : uint8_t
4751
{
@@ -87,6 +91,7 @@ class CommissionerControlDelegate : public Delegate
8791
ByteSpan mPAKEPasscodeVerifier;
8892

8993
bridge::FabricAdminDelegate * mFabricAdmin;
94+
CommissionerControlServer mCommissionerControlServer;
9095
};
9196

9297
} // namespace CommissionerControl

examples/fabric-sync/bridge/src/CommissionerControlDelegate.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ CHIP_ERROR CommissionerControlDelegate::HandleCommissioningApprovalRequest(const
114114
mLabel.ClearValue();
115115
}
116116

117-
CHIP_ERROR err = CommissionerControlServer::Instance().GenerateCommissioningRequestResultEvent(kAggregatorEndpointId, result);
117+
CHIP_ERROR err = mCommissionerControlServer.GenerateCommissioningRequestResultEvent(kAggregatorEndpointId, result);
118118

119119
if (err == CHIP_NO_ERROR)
120120
{
@@ -227,7 +227,7 @@ CHIP_ERROR CommissionerControlInit(bridge::FabricAdminDelegate * fabricAdmin)
227227
return CHIP_ERROR_NO_MEMORY;
228228
}
229229

230-
err = Clusters::CommissionerControl::CommissionerControlServer::Instance().Init(*sCommissionerControlDelegate);
230+
err = sCommissionerControlDelegate->GetCommissionerControlServer().Init();
231231
if (err != CHIP_NO_ERROR)
232232
{
233233
ChipLogError(AppServer, "Initialization failed on Commissioner Control Delegate.");
@@ -241,7 +241,7 @@ CHIP_ERROR CommissionerControlInit(bridge::FabricAdminDelegate * fabricAdmin)
241241
supportedDeviceCategories.SetField(Clusters::CommissionerControl::SupportedDeviceCategoryBitmap::kFabricSynchronization, 1);
242242

243243
Protocols::InteractionModel::Status status =
244-
Clusters::CommissionerControl::CommissionerControlServer::Instance().SetSupportedDeviceCategoriesValue(
244+
sCommissionerControlDelegate->GetCommissionerControlServer().SetSupportedDeviceCategoriesValue(
245245
Clusters::CommissionerControl::kAggregatorEndpointId, supportedDeviceCategories);
246246

247247
if (status != Protocols::InteractionModel::Status::Success)

src/app/clusters/commissioner-control-server/commissioner-control-server.cpp

+86-83
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
#include <app-common/zap-generated/attributes/Accessors.h>
2323
#include <app-common/zap-generated/cluster-enums.h>
2424
#include <app-common/zap-generated/cluster-objects.h>
25-
#include <app/AttributeAccessInterface.h>
26-
#include <app/AttributeAccessInterfaceRegistry.h>
2725
#include <app/CommandHandler.h>
26+
#include <app/CommandHandlerInterfaceRegistry.h>
2827
#include <app/EventLogging.h>
2928
#include <app/reporting/reporting.h>
29+
#include <platform/CHIPDeviceLayer.h>
3030
#include <platform/PlatformManager.h>
3131

3232
#include <memory>
@@ -38,9 +38,9 @@ using chip::Protocols::InteractionModel::Status;
3838

3939
namespace {
4040

41-
NodeId GetNodeId(const CommandHandler * commandObj)
41+
NodeId GetNodeId(const CommandHandler & commandHandler)
4242
{
43-
auto descriptor = commandObj->GetSubjectDescriptor();
43+
auto descriptor = commandHandler.GetSubjectDescriptor();
4444

4545
if (descriptor.authMode != Access::AuthMode::kCase)
4646
{
@@ -49,7 +49,7 @@ NodeId GetNodeId(const CommandHandler * commandObj)
4949
return descriptor.subject;
5050
}
5151

52-
void AddReverseOpenCommissioningWindowResponse(CommandHandler * commandObj, const ConcreteCommandPath & path,
52+
void AddReverseOpenCommissioningWindowResponse(CommandHandler & commandHandler, const ConcreteCommandPath & path,
5353
const Clusters::CommissionerControl::CommissioningWindowParams & params)
5454
{
5555
Clusters::CommissionerControl::Commands::ReverseOpenCommissioningWindow::Type response;
@@ -59,30 +59,7 @@ void AddReverseOpenCommissioningWindowResponse(CommandHandler * commandObj, cons
5959
response.PAKEPasscodeVerifier = params.PAKEPasscodeVerifier;
6060
response.salt = params.salt;
6161

62-
commandObj->AddResponse(path, response);
63-
}
64-
65-
void RunDeferredCommissionNode(intptr_t commandArg)
66-
{
67-
auto * params = reinterpret_cast<Clusters::CommissionerControl::CommissioningWindowParams *>(commandArg);
68-
69-
Clusters::CommissionerControl::Delegate * delegate =
70-
Clusters::CommissionerControl::CommissionerControlServer::Instance().GetDelegate();
71-
72-
if (delegate != nullptr)
73-
{
74-
CHIP_ERROR err = delegate->HandleCommissionNode(*params);
75-
if (err != CHIP_NO_ERROR)
76-
{
77-
ChipLogError(Zcl, "HandleCommissionNode error: %" CHIP_ERROR_FORMAT, err.Format());
78-
}
79-
}
80-
else
81-
{
82-
ChipLogError(Zcl, "No delegate available for HandleCommissionNode");
83-
}
84-
85-
delete params;
62+
commandHandler.AddResponse(path, response);
8663
}
8764

8865
} // namespace
@@ -92,16 +69,20 @@ namespace app {
9269
namespace Clusters {
9370
namespace CommissionerControl {
9471

95-
CommissionerControlServer CommissionerControlServer::sInstance;
72+
CommissionerControlServer::CommissionerControlServer(Delegate * delegate, EndpointId endpointId, ClusterId clusterId) :
73+
CommandHandlerInterface(MakeOptional(endpointId), clusterId)
74+
{
75+
mDelegate = delegate;
76+
}
9677

97-
CommissionerControlServer & CommissionerControlServer::Instance()
78+
CommissionerControlServer::~CommissionerControlServer()
9879
{
99-
return sInstance;
80+
CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(this);
10081
}
10182

102-
CHIP_ERROR CommissionerControlServer::Init(Delegate & delegate)
83+
CHIP_ERROR CommissionerControlServer::Init()
10384
{
104-
mDelegate = &delegate;
85+
ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(this));
10586
return CHIP_NO_ERROR;
10687
}
10788

@@ -146,38 +127,53 @@ CommissionerControlServer::GenerateCommissioningRequestResultEvent(EndpointId en
146127
return error;
147128
}
148129

149-
} // namespace CommissionerControl
150-
} // namespace Clusters
151-
} // namespace app
152-
} // namespace chip
130+
void CommissionerControlServer::InvokeCommand(HandlerContext & handlerContext)
131+
{
132+
ChipLogDetail(Zcl, "CommissionerControl: InvokeCommand");
133+
switch (handlerContext.mRequestPath.mCommandId)
134+
{
135+
case Commands::RequestCommissioningApproval::Id:
136+
ChipLogDetail(Zcl, "CommissionerControl: Entering RequestCommissioningApproval");
153137

154-
bool emberAfCommissionerControlClusterRequestCommissioningApprovalCallback(
155-
app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath,
156-
const Clusters::CommissionerControl::Commands::RequestCommissioningApproval::DecodableType & commandData)
138+
CommandHandlerInterface::HandleCommand<Commands::RequestCommissioningApproval::DecodableType>(
139+
handlerContext, [this](HandlerContext & ctx, const auto & req) { HandleRequestCommissioningApproval(ctx, req); });
140+
break;
141+
142+
case Commands::CommissionNode::Id:
143+
ChipLogDetail(Zcl, "CommissionerControl: Entering CommissionNode");
144+
145+
CommandHandlerInterface::HandleCommand<Commands::CommissionNode::DecodableType>(
146+
handlerContext, [this](HandlerContext & ctx, const auto & req) { HandleCommissionNode(ctx, req); });
147+
break;
148+
}
149+
}
150+
151+
void CommissionerControlServer::HandleRequestCommissioningApproval(
152+
HandlerContext & ctx, const Commands::RequestCommissioningApproval::DecodableType & req)
157153
{
158154
CHIP_ERROR err = CHIP_NO_ERROR;
159155
Status status = Status::Success;
160156

161157
ChipLogProgress(Zcl, "Received command to request commissioning approval");
162158

163-
auto sourceNodeId = GetNodeId(commandObj);
159+
auto sourceNodeId = GetNodeId(ctx.mCommandHandler);
164160

165161
// Check if the command is executed via a CASE session
166162
if (sourceNodeId == kUndefinedNodeId)
167163
{
168164
ChipLogError(Zcl, "Commissioning approval request not executed via CASE session, failing with UNSUPPORTED_ACCESS");
169-
commandObj->AddStatus(commandPath, Status::UnsupportedAccess);
170-
return true;
165+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::UnsupportedAccess);
166+
return;
171167
}
172168

173-
auto fabricIndex = commandObj->GetAccessingFabricIndex();
174-
auto requestId = commandData.requestID;
175-
auto vendorId = commandData.vendorID;
176-
auto productId = commandData.productID;
169+
auto fabricIndex = ctx.mCommandHandler.GetAccessingFabricIndex();
170+
auto requestId = req.requestID;
171+
auto vendorId = req.vendorID;
172+
auto productId = req.productID;
177173

178-
// The label assigned from commandData need to be stored in CommissionerControl::Delegate which ensure that the backing buffer
174+
// The label assigned from req need to be stored in CommissionerControl::Delegate which ensure that the backing buffer
179175
// of it has a valid lifespan during fabric sync setup process.
180-
auto & label = commandData.label;
176+
auto & label = req.label;
181177

182178
// Create a CommissioningApprovalRequest struct and populate it with the command data
183179
Clusters::CommissionerControl::CommissioningApprovalRequest request = { .requestId = requestId,
@@ -187,86 +183,93 @@ bool emberAfCommissionerControlClusterRequestCommissioningApprovalCallback(
187183
.fabricIndex = fabricIndex,
188184
.label = label };
189185

190-
Clusters::CommissionerControl::Delegate * delegate =
191-
Clusters::CommissionerControl::CommissionerControlServer::Instance().GetDelegate();
192-
193-
VerifyOrExit(delegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
186+
VerifyOrExit(mDelegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
194187

195188
// Handle commissioning approval request
196-
err = delegate->HandleCommissioningApprovalRequest(request);
189+
err = mDelegate->HandleCommissioningApprovalRequest(request);
197190

198191
exit:
199192
if (err != CHIP_NO_ERROR)
200193
{
201-
ChipLogError(Zcl, "emberAfCommissionerControlClusterRequestCommissioningApprovalCallback error: %" CHIP_ERROR_FORMAT,
202-
err.Format());
194+
ChipLogError(Zcl, "HandleRequestCommissioningApproval error: %" CHIP_ERROR_FORMAT, err.Format());
203195
status = StatusIB(err).mStatus;
204196
}
205197

206-
commandObj->AddStatus(commandPath, status);
207-
return true;
198+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, status);
208199
}
209200

210-
bool emberAfCommissionerControlClusterCommissionNodeCallback(
211-
app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath,
212-
const Clusters::CommissionerControl::Commands::CommissionNode::DecodableType & commandData)
201+
void CommissionerControlServer::HandleCommissionNode(HandlerContext & ctx, const Commands::CommissionNode::DecodableType & req)
213202
{
214203
CHIP_ERROR err = CHIP_NO_ERROR;
215204

216205
ChipLogProgress(Zcl, "Received command to commission node");
217206

218-
auto sourceNodeId = GetNodeId(commandObj);
207+
auto sourceNodeId = GetNodeId(ctx.mCommandHandler);
219208

220209
// Constraint on responseTimeoutSeconds is [30; 120] seconds
221-
if ((commandData.responseTimeoutSeconds < 30) || (commandData.responseTimeoutSeconds > 120))
210+
if ((req.responseTimeoutSeconds < 30) || (req.responseTimeoutSeconds > 120))
222211
{
223212
ChipLogError(Zcl, "Invalid responseTimeoutSeconds for CommissionNode.");
224-
commandObj->AddStatus(commandPath, Status::ConstraintError);
225-
return true;
213+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
214+
return;
226215
}
227216

228217
// Check if the command is executed via a CASE session
229218
if (sourceNodeId == kUndefinedNodeId)
230219
{
231220
ChipLogError(Zcl, "Commission node request not executed via CASE session, failing with UNSUPPORTED_ACCESS");
232-
commandObj->AddStatus(commandPath, Status::UnsupportedAccess);
233-
return true;
221+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::UnsupportedAccess);
222+
return;
234223
}
235224

236-
auto requestId = commandData.requestID;
237-
225+
auto requestId = req.requestID;
226+
auto delegate = mDelegate;
238227
auto commissioningWindowParams = std::make_unique<Clusters::CommissionerControl::CommissioningWindowParams>();
239228

240-
Clusters::CommissionerControl::Delegate * delegate =
241-
Clusters::CommissionerControl::CommissionerControlServer::Instance().GetDelegate();
242-
243-
VerifyOrExit(delegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
229+
VerifyOrExit(mDelegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
244230

245231
// Validate the commission node command.
246-
err = delegate->ValidateCommissionNodeCommand(sourceNodeId, requestId);
232+
err = mDelegate->ValidateCommissionNodeCommand(sourceNodeId, requestId);
247233
SuccessOrExit(err);
248234

249235
// Populate the parameters for the commissioning window
250-
err = delegate->GetCommissioningWindowParams(*commissioningWindowParams);
236+
err = mDelegate->GetCommissioningWindowParams(*commissioningWindowParams);
251237
SuccessOrExit(err);
252238

253239
// Add the response for the commissioning window.
254-
AddReverseOpenCommissioningWindowResponse(commandObj, commandPath, *commissioningWindowParams);
240+
AddReverseOpenCommissioningWindowResponse(ctx.mCommandHandler, ctx.mRequestPath, *commissioningWindowParams);
255241

256242
// Schedule the deferred reverse commission node task
257-
DeviceLayer::PlatformMgr().ScheduleWork(RunDeferredCommissionNode,
258-
reinterpret_cast<intptr_t>(commissioningWindowParams.release()));
243+
DeviceLayer::SystemLayer().ScheduleLambda([delegate, params = commissioningWindowParams.release()]() {
244+
if (delegate != nullptr)
245+
{
246+
CHIP_ERROR error = delegate->HandleCommissionNode(*params);
247+
if (error != CHIP_NO_ERROR)
248+
{
249+
ChipLogError(Zcl, "HandleCommissionNode error: %" CHIP_ERROR_FORMAT, error.Format());
250+
}
251+
}
252+
else
253+
{
254+
ChipLogError(Zcl, "No delegate available for HandleCommissionNode");
255+
}
256+
257+
delete params;
258+
});
259259

260260
exit:
261261
if (err != CHIP_NO_ERROR)
262262
{
263-
ChipLogError(Zcl, "emberAfCommissionerControlClusterCommissionNodeCallback error: %" CHIP_ERROR_FORMAT, err.Format());
264-
commandObj->AddStatus(commandPath, StatusIB(err).mStatus);
263+
ChipLogError(Zcl, "HandleCommissionNode error: %" CHIP_ERROR_FORMAT, err.Format());
264+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, StatusIB(err).mStatus);
265265
}
266-
267-
return true;
268266
}
269267

268+
} // namespace CommissionerControl
269+
} // namespace Clusters
270+
} // namespace app
271+
} // namespace chip
272+
270273
void MatterCommissionerControlPluginServerInitCallback()
271274
{
272275
ChipLogProgress(Zcl, "Initializing Commissioner Control cluster.");

0 commit comments

Comments
 (0)