29
29
30
30
using DeviceControllerFactory = chip::Controller::DeviceControllerFactory;
31
31
32
+ constexpr const char kCommissionerAlpha [] = " alpha" ;
33
+ constexpr const char kCommissionerBeta [] = " beta" ;
34
+ constexpr const char kCommissionerGamma [] = " gamma" ;
35
+
36
+ constexpr chip::FabricId kCommissionerAlphaFabricId = 1 ;
37
+ constexpr chip::FabricId kCommissionerBetaFabricId = 2 ;
38
+ constexpr chip::FabricId kCommissionerGammaFabricId = 3 ;
39
+
32
40
CHIP_ERROR CHIPCommand::Run ()
33
41
{
34
42
#if CHIP_DEVICE_LAYER_TARGET_LINUX && CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
35
43
// By default, Linux device is configured as a BLE peripheral while the controller needs a BLE central.
36
44
ReturnLogErrorOnFailure (chip::DeviceLayer::Internal::BLEMgrImpl ().ConfigureBle (0 , true ));
37
45
#endif
38
46
39
- ReturnLogErrorOnFailure (mStorage .Init ());
40
- ReturnLogErrorOnFailure (mOpCredsIssuer .Initialize (mStorage ));
41
- ReturnLogErrorOnFailure (mFabricStorage .Initialize (&mStorage ));
47
+ ReturnLogErrorOnFailure (mDefaultStorage .Init ());
48
+ ReturnLogErrorOnFailure (mFabricStorage .Initialize (&mDefaultStorage ));
49
+
50
+ chip::Controller::FactoryInitParams factoryInitParams;
51
+ factoryInitParams.fabricStorage = &mFabricStorage ;
52
+ factoryInitParams.listenPort = static_cast <uint16_t >(mDefaultStorage .GetListenPort () + CurrentCommissionerIndex ());
53
+ ReturnLogErrorOnFailure (DeviceControllerFactory::GetInstance ().Init (factoryInitParams));
54
+
55
+ ReturnLogErrorOnFailure (InitializeCommissioner (CurrentCommissionerName (), CurrentCommissionerIndex ()));
56
+
57
+ chip::DeviceLayer::PlatformMgr ().ScheduleWork (RunQueuedCommand, reinterpret_cast <intptr_t >(this ));
58
+ ReturnLogErrorOnFailure (StartWaiting (GetWaitDuration ()));
59
+
60
+ Shutdown ();
61
+
62
+ //
63
+ // We can call DeviceController::Shutdown() safely without grabbing the stack lock
64
+ // since the CHIP thread and event queue have been stopped, preventing any thread
65
+ // races.
66
+ //
67
+ ReturnLogErrorOnFailure (ShutdownCommissioner (CurrentCommissionerName ()));
68
+
69
+ return CHIP_NO_ERROR;
70
+ }
71
+
72
+ std::string CHIPCommand::CurrentCommissionerName ()
73
+ {
74
+ std::string name = mCommissionerName .HasValue () ? mCommissionerName .Value () : kCommissionerAlpha ;
75
+ if (name.compare (kCommissionerAlpha ) != 0 && name.compare (kCommissionerBeta ) != 0 && name.compare (kCommissionerGamma ) != 0 )
76
+ {
77
+ ChipLogError (chipTool, " Unknown commissioner name: %s. Supported names are [%s, %s, %s]" , name.c_str (), kCommissionerAlpha ,
78
+ kCommissionerBeta , kCommissionerGamma );
79
+ chipDie ();
80
+ }
81
+
82
+ return name;
83
+ }
84
+
85
+ uint16_t CHIPCommand::CurrentCommissionerIndex ()
86
+ {
87
+ uint16_t index = 0 ;
88
+
89
+ std::string name = CurrentCommissionerName ();
90
+ if (name.compare (kCommissionerAlpha ) == 0 )
91
+ {
92
+ index = kCommissionerAlphaFabricId ;
93
+ }
94
+ else if (name.compare (kCommissionerBeta ) == 0 )
95
+ {
96
+ index = kCommissionerBetaFabricId ;
97
+ }
98
+ else if (name.compare (kCommissionerGamma ) == 0 )
99
+ {
100
+ index = kCommissionerGammaFabricId ;
101
+ }
102
+
103
+ VerifyOrDieWithMsg (index != 0 , chipTool, " Unknown commissioner name: %s. Supported names are [%s, %s, %s]" , name.c_str (),
104
+ kCommissionerAlpha , kCommissionerBeta , kCommissionerGamma );
105
+ return index ;
106
+ }
42
107
108
+ chip::Controller::DeviceCommissioner & CHIPCommand::CurrentCommissioner ()
109
+ {
110
+ auto item = mCommissioners .find (CurrentCommissionerName ());
111
+ return *item->second .get ();
112
+ }
113
+
114
+ CHIP_ERROR CHIPCommand::ShutdownCommissioner (std::string key)
115
+ {
116
+ return mCommissioners [key].get ()->Shutdown ();
117
+ }
118
+
119
+ CHIP_ERROR CHIPCommand::InitializeCommissioner (std::string key, chip::FabricId fabricId)
120
+ {
43
121
chip::Platform::ScopedMemoryBuffer<uint8_t > noc;
44
122
chip::Platform::ScopedMemoryBuffer<uint8_t > icac;
45
123
chip::Platform::ScopedMemoryBuffer<uint8_t > rcac;
@@ -64,36 +142,23 @@ CHIP_ERROR CHIPCommand::Run()
64
142
// TODO - OpCreds should only be generated for pairing command
65
143
// store the credentials in persistent storage, and
66
144
// generate when not available in the storage.
67
- ReturnLogErrorOnFailure (mOpCredsIssuer .GenerateNOCChainAfterValidation (mStorage .GetLocalNodeId (), mStorage .GetFabricId (),
145
+ ReturnLogErrorOnFailure (mCommissionerStorage .Init (key.c_str ()));
146
+ ReturnLogErrorOnFailure (mOpCredsIssuer .Initialize (mCommissionerStorage ));
147
+ ReturnLogErrorOnFailure (mOpCredsIssuer .GenerateNOCChainAfterValidation (mCommissionerStorage .GetLocalNodeId (), fabricId,
68
148
ephemeralKey.Pubkey (), rcacSpan, icacSpan, nocSpan));
69
149
70
- chip::Controller::FactoryInitParams factoryInitParams;
71
- factoryInitParams.fabricStorage = &mFabricStorage ;
72
- factoryInitParams.listenPort = mStorage .GetListenPort ();
73
-
150
+ std::unique_ptr<ChipDeviceCommissioner> commissioner = std::make_unique<ChipDeviceCommissioner>();
74
151
chip::Controller::SetupParams commissionerParams;
75
- commissionerParams.storageDelegate = &mStorage ;
152
+ commissionerParams.storageDelegate = &mCommissionerStorage ;
76
153
commissionerParams.operationalCredentialsDelegate = &mOpCredsIssuer ;
77
154
commissionerParams.ephemeralKeypair = &ephemeralKey;
78
155
commissionerParams.controllerRCAC = rcacSpan;
79
156
commissionerParams.controllerICAC = icacSpan;
80
157
commissionerParams.controllerNOC = nocSpan;
81
158
commissionerParams.controllerVendorId = chip::VendorId::TestVendor1;
82
159
83
- ReturnLogErrorOnFailure (DeviceControllerFactory::GetInstance ().Init (factoryInitParams));
84
- ReturnLogErrorOnFailure (DeviceControllerFactory::GetInstance ().SetupCommissioner (commissionerParams, mController ));
85
-
86
- chip::DeviceLayer::PlatformMgr ().ScheduleWork (RunQueuedCommand, reinterpret_cast <intptr_t >(this ));
87
- ReturnLogErrorOnFailure (StartWaiting (GetWaitDuration ()));
88
-
89
- Shutdown ();
90
-
91
- //
92
- // We can call DeviceController::Shutdown() safely without grabbing the stack lock
93
- // since the CHIP thread and event queue have been stopped, preventing any thread
94
- // races.
95
- //
96
- ReturnLogErrorOnFailure (mController .Shutdown ());
160
+ ReturnLogErrorOnFailure (DeviceControllerFactory::GetInstance ().SetupCommissioner (commissionerParams, *(commissioner.get ())));
161
+ mCommissioners [key] = std::move (commissioner);
97
162
98
163
return CHIP_NO_ERROR;
99
164
}
0 commit comments