Skip to content

Commit 8c7acb6

Browse files
andy31415andreilitvinrestyled-commitsbzbarsky-apple
authored
Set dataModelProvider as a required argument for Controller::FactoryInitParams (project-chip#36613)
* Add dataModelProvider to Factor init parameters for the codegen data model provider * make setting the same data model on interaction model provider a noop * Fix compile * Fix links * Restyle * Restyled by prettier-markdown * Fix text * Fix some deps * Restyled by gn * Remove dependencies/auto-init of codegen data model in the interaction model. We now fully expect all applications to provide a data model provider * Fix include * Update src/app/InteractionModelEngine.cpp Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Address some code review comments * Fix unit tests * Restyle * Add more comments about why we have very intentional ordering --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> Co-authored-by: Restyled.io <commits@restyled.io> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
1 parent b76c3fa commit 8c7acb6

20 files changed

+98
-37
lines changed

docs/upgrading.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,12 @@ Replacements for methods are:
9393
- `chip::app::GetAttributeAccessOverride` replaced by
9494
`chip::app::AttributeAccessInterfaceRegistry::Instance().Get`
9595

96-
### `ServerInitParams::dataModelProvider` in `Server::Init`
96+
### `ServerInitParams::dataModelProvider` in `Server::Init` and `FactoryInitParams`
9797

98-
Server initialization requires a set data model provider to work rather than
99-
auto-initializing ember-compatible code-generated data models.
98+
Server and controller initialization require a set data model provider to work
99+
rather than auto-initializing ember-compatible code-generated data models.
100100

101101
To preserve `codegen/zap` generated logic, use
102102
`CodegenDataModelProviderInstance` (see changes in
103-
<https://github.com/project-chip/connectedhomeip/pull/36558>).
103+
[36558](https://github.com/project-chip/connectedhomeip/pull/36558) and
104+
[36613](https://github.com/project-chip/connectedhomeip/pull/36613) ).

examples/chip-tool/commands/common/CHIPCommand.cpp

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

1919
#include "CHIPCommand.h"
2020

21+
#include <app/codegen-data-model-provider/Instance.h>
2122
#include <commands/icd/ICDCommand.h>
2223
#include <controller/CHIPDeviceControllerFactory.h>
2324
#include <credentials/attestation_verifier/FileAttestationTrustStore.h>
@@ -137,6 +138,7 @@ CHIP_ERROR CHIPCommand::MaybeSetUpStack()
137138
factoryInitParams.opCertStore = &mOpCertStore;
138139
factoryInitParams.enableServerInteractions = NeedsOperationalAdvertising();
139140
factoryInitParams.sessionKeystore = &sSessionKeystore;
141+
factoryInitParams.dataModelProvider = chip::app::CodegenDataModelProviderInstance();
140142

141143
// Init group data provider that will be used for all group keys and IPKs for the
142144
// chip-tool-configured fabrics. This is OK to do once since the fabric tables

examples/fabric-admin/commands/common/CHIPCommand.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "CHIPCommand.h"
2020

2121
#include "IcdManager.h"
22+
23+
#include <app/codegen-data-model-provider/Instance.h>
2224
#include <controller/CHIPDeviceControllerFactory.h>
2325
#include <credentials/attestation_verifier/FileAttestationTrustStore.h>
2426
#include <device_manager/PairingManager.h>
@@ -121,6 +123,7 @@ CHIP_ERROR CHIPCommand::MaybeSetUpStack()
121123
factoryInitParams.opCertStore = &mOpCertStore;
122124
factoryInitParams.enableServerInteractions = NeedsOperationalAdvertising();
123125
factoryInitParams.sessionKeystore = &sSessionKeystore;
126+
factoryInitParams.dataModelProvider = chip::app::CodegenDataModelProviderInstance();
124127

125128
// Init group data provider that will be used for all group keys and IPKs for the
126129
// fabric-admin-configured fabrics. This is OK to do once since the fabric tables

examples/platform/linux/BUILD.gn

+4-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,10 @@ source_set("commissioner-main") {
164164
"${chip_root}/src/controller:controller",
165165
"${chip_root}/src/lib",
166166
]
167-
deps = [ "${chip_root}/src/app/server" ]
167+
deps = [
168+
"${chip_root}/src/app/codegen-data-model-provider:instance-header",
169+
"${chip_root}/src/app/server",
170+
]
168171

169172
if (chip_enable_transport_trace) {
170173
deps += [ "${chip_root}/examples/common/tracing:trace_handlers" ]

examples/platform/linux/CommissionerMain.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
2525

2626
#include <app/clusters/network-commissioning/network-commissioning.h>
27+
#include <app/codegen-data-model-provider/Instance.h>
2728
#include <app/server/Dnssd.h>
2829
#include <app/server/OnboardingCodesUtil.h>
2930
#include <app/server/Server.h>
@@ -134,6 +135,7 @@ CHIP_ERROR InitCommissioner(uint16_t commissionerPort, uint16_t udcListenPort, F
134135
factoryParams.fabricIndependentStorage = &gServerStorage;
135136
factoryParams.fabricTable = &Server::GetInstance().GetFabricTable();
136137
factoryParams.sessionKeystore = &gSessionKeystore;
138+
factoryParams.dataModelProvider = chip::app::CodegenDataModelProviderInstance();
137139

138140
gGroupDataProvider.SetStorageDelegate(&gServerStorage);
139141
gGroupDataProvider.SetSessionKeystore(factoryParams.sessionKeystore);

src/app/BUILD.gn

-4
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,6 @@ static_library("interaction-model") {
206206
"${chip_root}/src/app:global-attributes",
207207
]
208208

209-
# Temporary dependency: codegen data provider instance should be provided
210-
# by the application
211-
deps += [ "${chip_root}/src/app/codegen-data-model-provider:instance-header" ]
212-
213209
public_deps = [
214210
":app_config",
215211
":command-handler-impl",

src/app/InteractionModelEngine.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@
5050
#include <lib/support/FibonacciUtils.h>
5151
#include <protocols/interaction_model/StatusCode.h>
5252

53-
// TODO: defaulting to codegen should eventually be an application choice and not
54-
// hard-coded in the interaction model
55-
#include <app/codegen-data-model-provider/Instance.h>
56-
5753
namespace chip {
5854
namespace app {
5955
namespace {
@@ -1798,9 +1794,15 @@ Protocols::InteractionModel::Status InteractionModelEngine::CheckCommandExistenc
17981794

17991795
DataModel::Provider * InteractionModelEngine::SetDataModelProvider(DataModel::Provider * model)
18001796
{
1801-
// Alternting data model should not be done while IM is actively handling requests.
1797+
// Altering data model should not be done while IM is actively handling requests.
18021798
VerifyOrDie(mReadHandlers.begin() == mReadHandlers.end());
18031799

1800+
if (model == mDataModelProvider)
1801+
{
1802+
// no-op, just return
1803+
return model;
1804+
}
1805+
18041806
DataModel::Provider * oldModel = mDataModelProvider;
18051807
if (oldModel != nullptr)
18061808
{
@@ -1830,14 +1832,11 @@ DataModel::Provider * InteractionModelEngine::SetDataModelProvider(DataModel::Pr
18301832
return oldModel;
18311833
}
18321834

1833-
DataModel::Provider * InteractionModelEngine::GetDataModelProvider()
1835+
DataModel::Provider * InteractionModelEngine::GetDataModelProvider() const
18341836
{
1835-
if (mDataModelProvider == nullptr)
1836-
{
1837-
// These should be called within the CHIP processing loop.
1838-
assertChipStackLockedByCurrentThread();
1839-
SetDataModelProvider(CodegenDataModelProviderInstance());
1840-
}
1837+
// These should be called within the CHIP processing loop.
1838+
assertChipStackLockedByCurrentThread();
1839+
18411840
return mDataModelProvider;
18421841
}
18431842

src/app/InteractionModelEngine.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
404404
}
405405
#endif
406406

407-
// Temporarily NOT const because the data model provider will be auto-set
408-
// to codegen on first usage. This behaviour will be changed once each
409-
// application must explicitly set the data model provider.
410-
DataModel::Provider * GetDataModelProvider();
407+
DataModel::Provider * GetDataModelProvider() const;
411408

412409
// MUST NOT be used while the interaction model engine is running as interaction
413410
// model functionality (e.g. active reads/writes/subscriptions) rely on data model

src/app/SubscriptionResumptionSessionEstablisher.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
#include <app/InteractionModelEngine.h>
1919
#include <app/SubscriptionResumptionSessionEstablisher.h>
20-
#include <app/codegen-data-model-provider/Instance.h>
2120

2221
namespace chip {
2322
namespace app {

src/app/tests/TestAclEvent.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <app/InteractionModelEngine.h>
2525
#include <app/MessageDef/AttributeReportIBs.h>
2626
#include <app/MessageDef/EventDataIB.h>
27+
#include <app/codegen-data-model-provider/Instance.h>
2728
#include <app/reporting/tests/MockReportScheduler.h>
2829
#include <app/tests/AppTestContext.h>
2930
#include <app/tests/test-interaction-model-api.h>
@@ -217,6 +218,7 @@ TEST_F(TestAclEvent, TestReadRoundtripWithEventStatusIBInEventReport)
217218

218219
auto * engine = chip::app::InteractionModelEngine::GetInstance();
219220

221+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
220222
EXPECT_EQ(engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler()), CHIP_NO_ERROR);
221223

222224
// A custom AccessControl::Delegate has been installed that grants privilege to any cluster except the test cluster.

src/app/tests/TestInteractionModelEngine.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ TEST_F(TestInteractionModelEngine, TestAttributePathParamsPushRelease)
8888

8989
InteractionModelEngine * engine = InteractionModelEngine::GetInstance();
9090

91+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
9192
EXPECT_EQ(engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler()), CHIP_NO_ERROR);
9293

9394
SingleLinkedListNode<AttributePathParams> * attributePathParamsList = nullptr;
@@ -123,6 +124,7 @@ TEST_F(TestInteractionModelEngine, TestRemoveDuplicateConcreteAttribute)
123124

124125
InteractionModelEngine * engine = InteractionModelEngine::GetInstance();
125126

127+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
126128
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler()));
127129

128130
SingleLinkedListNode<AttributePathParams> * attributePathParamsList = nullptr;
@@ -259,6 +261,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubjectHasActiveSubscription
259261
ASSERT_TRUE(exchangeCtx1);
260262

261263
// InteractionModelEngine init
264+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
262265
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), reporting::GetDefaultReportScheduler()));
263266

264267
// Verify that there are no active subscriptions
@@ -306,6 +309,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubjectHasActiveSubscription
306309
ASSERT_TRUE(exchangeCtx1);
307310

308311
// InteractionModelEngine init
312+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
309313
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), reporting::GetDefaultReportScheduler()));
310314

311315
// Verify that both Alice and Bob have no active subscriptions
@@ -364,6 +368,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubjectHasActiveSubscription
364368
ASSERT_TRUE(exchangeCtx2);
365369

366370
// InteractionModelEngine init
371+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
367372
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), reporting::GetDefaultReportScheduler()));
368373

369374
// Verify that both Alice and Bob have no active subscriptions
@@ -446,6 +451,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubjectHasActiveSubscription
446451
ASSERT_TRUE(exchangeCtx22);
447452

448453
// InteractionModelEngine init
454+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
449455
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), reporting::GetDefaultReportScheduler()));
450456

451457
// Verify that both Alice and Bob have no active subscriptions
@@ -525,6 +531,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubjectHasActiveSubscription
525531
FabricIndex bobFabricIndex = 1;
526532

527533
// InteractionModelEngine init
534+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
528535
EXPECT_EQ(CHIP_NO_ERROR, engine->Init(&GetExchangeManager(), &GetFabricTable(), reporting::GetDefaultReportScheduler()));
529536

530537
// Make sure we are using CASE sessions, because there is no defunct-marking for PASE.
@@ -575,6 +582,7 @@ TEST_F(TestInteractionModelEngine, TestSubjectHasPersistedSubscription)
575582

576583
EXPECT_EQ(subscriptionStorage.Init(&storage), CHIP_NO_ERROR);
577584

585+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
578586
EXPECT_EQ(CHIP_NO_ERROR,
579587
engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler(), nullptr,
580588
&subscriptionStorage));
@@ -630,6 +638,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestSubscriptionResumptionTimer)
630638

631639
InteractionModelEngine * engine = InteractionModelEngine::GetInstance();
632640

641+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
633642
EXPECT_EQ(engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler()), CHIP_NO_ERROR);
634643

635644
uint32_t timeTillNextResubscriptionMs;
@@ -661,6 +670,7 @@ TEST_F_FROM_FIXTURE(TestInteractionModelEngine, TestDecrementNumSubscriptionsToR
661670
constexpr uint8_t kNumberOfSubsToResume = 5;
662671
uint8_t numberOfSubsRemaining = kNumberOfSubsToResume;
663672

673+
engine->SetDataModelProvider(CodegenDataModelProviderInstance());
664674
EXPECT_EQ(engine->Init(&GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler()), CHIP_NO_ERROR);
665675

666676
#if CHIP_CONFIG_ENABLE_ICD_CIP && !CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION

src/controller/CHIPDeviceControllerFactory.cpp

+24-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include <controller/CHIPDeviceControllerFactory.h>
2626

27+
#include <app/InteractionModelEngine.h>
2728
#include <app/OperationalSessionSetup.h>
2829
#include <app/TimerDelegates.h>
2930
#include <app/reporting/ReportSchedulerImpl.h>
@@ -100,6 +101,10 @@ CHIP_ERROR DeviceControllerFactory::ReinitSystemStateIfNecessary()
100101
params.certificateValidityPolicy = mCertificateValidityPolicy;
101102
params.sessionResumptionStorage = mSessionResumptionStorage;
102103

104+
// re-initialization keeps any previously initialized values. The only place where
105+
// a provider exists is in the InteractionModelEngine, so just say "keep it as is".
106+
params.dataModelProvider = app::InteractionModelEngine::GetInstance()->GetDataModelProvider();
107+
103108
return InitSystemState(params);
104109
}
105110

@@ -127,6 +132,13 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params)
127132
ChipLogError(Controller, "Warning: Device Controller Factory should be with a CHIP Device Layer...");
128133
#endif // CONFIG_DEVICE_LAYER
129134

135+
if (params.dataModelProvider == nullptr)
136+
{
137+
ChipLogError(AppServer, "Device Controller Factory requires a `dataModelProvider` value.");
138+
ChipLogError(AppServer, "For backwards compatibility, you likely can use `CodegenDataModelProviderInstance()`");
139+
}
140+
141+
VerifyOrReturnError(params.dataModelProvider != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
130142
VerifyOrReturnError(stateParams.systemLayer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
131143
VerifyOrReturnError(stateParams.udpEndPointManager != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
132144

@@ -238,6 +250,16 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params)
238250
ReturnErrorOnFailure(stateParams.unsolicitedStatusHandler->Init(stateParams.exchangeMgr));
239251
ReturnErrorOnFailure(stateParams.bdxTransferServer->Init(stateParams.systemLayer, stateParams.exchangeMgr));
240252

253+
chip::app::InteractionModelEngine * interactionModelEngine = chip::app::InteractionModelEngine::GetInstance();
254+
255+
// Note placement of this BEFORE `InitDataModelHandler` since InitDataModelHandler may
256+
// rely on ember (does emberAfInit() and configure which may load data from NVM).
257+
//
258+
// Expected forward path is that we will move move and more things inside datamodel
259+
// provider (e.g. storage settings) so we want datamodelprovider available before
260+
// `InitDataModelHandler`.
261+
interactionModelEngine->SetDataModelProvider(params.dataModelProvider);
262+
241263
InitDataModelHandler();
242264

243265
ReturnErrorOnFailure(Dnssd::Resolver::Instance().Init(stateParams.udpEndPointManager));
@@ -295,8 +317,8 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params)
295317
stateParams.caseSessionManager = Platform::New<CASESessionManager>();
296318
ReturnErrorOnFailure(stateParams.caseSessionManager->Init(stateParams.systemLayer, sessionManagerConfig));
297319

298-
ReturnErrorOnFailure(chip::app::InteractionModelEngine::GetInstance()->Init(
299-
stateParams.exchangeMgr, stateParams.fabricTable, stateParams.reportScheduler, stateParams.caseSessionManager));
320+
ReturnErrorOnFailure(interactionModelEngine->Init(stateParams.exchangeMgr, stateParams.fabricTable, stateParams.reportScheduler,
321+
stateParams.caseSessionManager));
300322

301323
// store the system state
302324
mSystemState = chip::Platform::New<DeviceControllerSystemState>(std::move(stateParams));

src/controller/CHIPDeviceControllerFactory.h

+5
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ struct FactoryInitParams
160160
/* The port used for operational communication to listen for and send messages over UDP/TCP.
161161
* The default value of `0` will pick any available port. */
162162
uint16_t listenPort = 0;
163+
164+
// MUST NOT be null during initialization: every application must define the
165+
// data model it wants to use. Backwards-compatibility can use `CodegenDataModelProviderInstance`
166+
// for ember/zap-generated models.
167+
chip::app::DataModel::Provider * dataModelProvider = nullptr;
163168
};
164169

165170
class DeviceControllerFactory

src/controller/java/AndroidDeviceControllerWrapper.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,16 @@
2525

2626
#include <string.h>
2727

28+
#include <app/codegen-data-model-provider/Instance.h>
2829
#include <app/server/Dnssd.h>
29-
30-
#include <lib/support/CodeUtils.h>
31-
#include <lib/support/JniReferences.h>
32-
#include <lib/support/JniTypeWrappers.h>
33-
3430
#include <controller/CHIPDeviceControllerFactory.h>
3531
#include <controller/java/AndroidICDClient.h>
3632
#include <credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h>
3733
#include <credentials/attestation_verifier/DeviceAttestationVerifier.h>
3834
#include <lib/core/TLV.h>
35+
#include <lib/support/CodeUtils.h>
36+
#include <lib/support/JniReferences.h>
37+
#include <lib/support/JniTypeWrappers.h>
3938
#include <lib/support/PersistentStorageMacros.h>
4039
#include <lib/support/SafeInt.h>
4140
#include <lib/support/ScopedBuffer.h>
@@ -210,6 +209,7 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew(
210209
setupParams.defaultCommissioner = &wrapper->mAutoCommissioner;
211210
initParams.fabricIndependentStorage = wrapperStorage;
212211
initParams.sessionKeystore = &wrapper->mSessionKeystore;
212+
initParams.dataModelProvider = app::CodegenDataModelProviderInstance();
213213

214214
wrapper->mGroupDataProvider.SetStorageDelegate(wrapperStorage);
215215
wrapper->mGroupDataProvider.SetSessionKeystore(initParams.sessionKeystore);

src/controller/python/ChipDeviceController-ScriptBinding.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
#include <app/DeviceProxy.h>
4444
#include <app/InteractionModelEngine.h>
45+
#include <app/codegen-data-model-provider/Instance.h>
4546
#include <app/icd/client/CheckInHandler.h>
4647
#include <app/icd/client/DefaultCheckInDelegate.h>
4748
#include <app/icd/client/DefaultICDClientStorage.h>
@@ -271,6 +272,7 @@ PyChipError pychip_DeviceController_StackInit(Controller::Python::StorageAdapter
271272

272273
factoryParams.fabricIndependentStorage = storageAdapter;
273274
factoryParams.sessionKeystore = &sSessionKeystore;
275+
factoryParams.dataModelProvider = app::CodegenDataModelProviderInstance();
274276

275277
sICDClientStorage.Init(storageAdapter, &sSessionKeystore);
276278

src/controller/python/chip/internal/CommissionerImpl.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
#include <memory>
1818

19+
#include <app/codegen-data-model-provider/Instance.h>
1920
#include <controller/CHIPDeviceController.h>
2021
#include <controller/CHIPDeviceControllerFactory.h>
2122
#include <controller/ExampleOperationalCredentialsIssuer.h>
@@ -135,6 +136,7 @@ extern "C" chip::Controller::DeviceCommissioner * pychip_internal_Commissioner_N
135136

136137
factoryParams.fabricIndependentStorage = &gServerStorage;
137138
factoryParams.sessionKeystore = &gSessionKeystore;
139+
factoryParams.dataModelProvider = chip::app::CodegenDataModelProviderInstance();
138140

139141
// Initialize group data provider for local group key state and IPKs
140142
gGroupDataProvider.SetStorageDelegate(&gServerStorage);

0 commit comments

Comments
 (0)