@@ -123,7 +123,8 @@ NodeId gLocalId = kMaxOperationalNodeId;
123123Credentials::GroupDataProviderImpl gGroupDataProvider ;
124124Crypto::RawKeySessionKeystore gSessionKeystore ;
125125
126- CHIP_ERROR InitCommissioner (uint16_t commissionerPort, uint16_t udcListenPort, FabricId fabricId)
126+ CHIP_ERROR InitCommissioner (uint16_t commissionerPort, uint16_t udcListenPort, FabricId fabricId,
127+ FabricIndex commissionerFabricIndex)
127128{
128129 Controller::FactoryInitParams factoryParams;
129130 Controller::SetupParams params;
@@ -149,9 +150,17 @@ CHIP_ERROR InitCommissioner(uint16_t commissionerPort, uint16_t udcListenPort, F
149150 params.controllerVendorId = static_cast <VendorId>(vendorId);
150151
151152 ReturnErrorOnFailure (gOpCredsIssuer .Initialize (gServerStorage ));
152- if (fabricId != kUndefinedFabricId )
153+
154+ if (commissionerFabricIndex == kUndefinedFabricIndex && fabricId != kUndefinedFabricId )
153155 {
154- gOpCredsIssuer .SetFabricIdForNextNOCRequest (fabricId);
156+ for (const auto & fb : Server::GetInstance ().GetFabricTable ())
157+ {
158+ if (fb.GetFabricId () == fabricId)
159+ {
160+ commissionerFabricIndex = fb.GetFabricIndex ();
161+ break ;
162+ }
163+ }
155164 }
156165
157166 // No need to explicitly set the UDC port since we will use default
@@ -179,17 +188,34 @@ CHIP_ERROR InitCommissioner(uint16_t commissionerPort, uint16_t udcListenPort, F
179188 Platform::ScopedMemoryBuffer<uint8_t > rcac;
180189 VerifyOrReturnError (rcac.Alloc (Controller::kMaxCHIPDERCertLength ), CHIP_ERROR_NO_MEMORY);
181190 MutableByteSpan rcacSpan (rcac.Get (), Controller::kMaxCHIPDERCertLength );
182-
183191 Crypto::P256Keypair ephemeralKey;
184- ReturnErrorOnFailure (ephemeralKey.Initialize (Crypto::ECPKeyTarget::ECDSA));
185192
186- ReturnErrorOnFailure (gOpCredsIssuer .GenerateNOCChainAfterValidation (gLocalId , /* fabricId = */ 1 , chip::kUndefinedCATs ,
187- ephemeralKey.Pubkey (), rcacSpan, icacSpan, nocSpan));
193+ if (commissionerFabricIndex != kUndefinedFabricIndex )
194+ {
195+ params.fabricIndex .SetValue (commissionerFabricIndex);
196+ params.removeFromFabricTableOnShutdown = false ;
197+
198+ ChipLogProgress (Support, " ----- Commissioner reusing existing fabric index %u" ,
199+ static_cast <unsigned >(commissionerFabricIndex));
200+ }
201+ else
202+ {
203+ const FabricId commissionerFabricId = (fabricId == kUndefinedFabricId ) ? static_cast <FabricId>(1 ) : fabricId;
204+ if (commissionerFabricId != kUndefinedFabricId )
205+ {
206+ gOpCredsIssuer .SetFabricIdForNextNOCRequest (commissionerFabricId);
207+ }
208+
209+ ReturnErrorOnFailure (ephemeralKey.Initialize (Crypto::ECPKeyTarget::ECDSA));
210+
211+ ReturnErrorOnFailure (gOpCredsIssuer .GenerateNOCChainAfterValidation (gLocalId , commissionerFabricId, chip::kUndefinedCATs ,
212+ ephemeralKey.Pubkey (), rcacSpan, icacSpan, nocSpan));
188213
189- params.operationalKeypair = &ephemeralKey;
190- params.controllerRCAC = rcacSpan;
191- params.controllerICAC = icacSpan;
192- params.controllerNOC = nocSpan;
214+ params.operationalKeypair = &ephemeralKey;
215+ params.controllerRCAC = rcacSpan;
216+ params.controllerICAC = icacSpan;
217+ params.controllerNOC = nocSpan;
218+ }
193219
194220 params.defaultCommissioner = &gAutoCommissioner ;
195221 params.enableServerInteractions = true ;
@@ -227,7 +253,8 @@ CHIP_ERROR InitCommissioner(uint16_t commissionerPort, uint16_t udcListenPort, F
227253
228254 ChipLogProgress (Support,
229255 " InitCommissioner nodeId=0x" ChipLogFormatX64 " fabric.fabricId=0x" ChipLogFormatX64 " fabricIndex=0x%x" ,
230- ChipLogValueX64 (gCommissioner .GetNodeId ()), ChipLogValueX64 (fabricId), static_cast <unsigned >(fabricIndex));
256+ ChipLogValueX64 (gCommissioner .GetNodeId ()), ChipLogValueX64 (gCommissioner .GetFabricId ()),
257+ static_cast <unsigned >(fabricIndex));
231258
232259 return CHIP_NO_ERROR;
233260}
0 commit comments