Skip to content

Commit aa69085

Browse files
Add a way to dynamically change whether a node identity should be advertised. (#35634)
* Add a way to dynamically change whether a node identity should be advertised. In some cases, a node may need to stop or restart advertising its identity without actually tearing down the relevant CHIPDeviceController. * Add unit tests for SetShouldAdvertiseIdentity.
1 parent 5a9cc4c commit aa69085

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

src/credentials/FabricTable.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -2164,4 +2164,17 @@ CHIP_ERROR FabricTable::SetFabricIndexForNextAddition(FabricIndex fabricIndex)
21642164
return CHIP_NO_ERROR;
21652165
}
21662166

2167+
CHIP_ERROR FabricTable::SetShouldAdvertiseIdentity(FabricIndex fabricIndex, AdvertiseIdentity advertiseIdentity)
2168+
{
2169+
VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
2170+
2171+
FabricInfo * fabricInfo = GetMutableFabricByIndex(fabricIndex);
2172+
bool fabricIsInitialized = (fabricInfo != nullptr) && fabricInfo->IsInitialized();
2173+
VerifyOrReturnError(fabricIsInitialized, CHIP_ERROR_INVALID_FABRIC_INDEX);
2174+
2175+
fabricInfo->SetShouldAdvertiseIdentity(advertiseIdentity == AdvertiseIdentity::Yes);
2176+
2177+
return CHIP_NO_ERROR;
2178+
}
2179+
21672180
} // namespace chip

src/credentials/FabricTable.h

+14
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ class DLL_EXPORT FabricInfo
212212
mNodeId = kUndefinedNodeId;
213213
}
214214

215+
void SetShouldAdvertiseIdentity(bool advertiseIdentity) { mShouldAdvertiseIdentity = advertiseIdentity; }
216+
215217
static constexpr size_t MetadataTLVMaxSize()
216218
{
217219
return TLV::EstimateStructOverhead(sizeof(uint16_t), kFabricLabelMaxLengthInBytes);
@@ -1027,6 +1029,18 @@ class DLL_EXPORT FabricTable
10271029
*/
10281030
CHIP_ERROR SetFabricIndexForNextAddition(FabricIndex fabricIndex);
10291031

1032+
/**
1033+
* @brief Set the advertising behavior for the fabric identified by `fabricIndex`.
1034+
*
1035+
* It is the caller's responsibility to actually restart DNS-SD advertising
1036+
* as needed after updating this state.
1037+
*
1038+
* @param fabricIndex - Fabric Index for which to set the label
1039+
* @param advertiseIdentity - whether the identity for this fabric should be advertised.
1040+
* @retval CHIP_ERROR_INVALID_FABRIC_INDEX if fabricIndex does not refer to a fabric in the table
1041+
*/
1042+
CHIP_ERROR SetShouldAdvertiseIdentity(FabricIndex fabricIndex, AdvertiseIdentity advertiseIdentity);
1043+
10301044
private:
10311045
enum class StateFlags : uint16_t
10321046
{

src/credentials/tests/TestFabricTable.cpp

+31-1
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ TEST_F(TestFabricTable, TestBasicAddNocUpdateNocFlow)
706706
{
707707
EXPECT_EQ(iterFabricInfo.GetNodeId(), nodeId);
708708
EXPECT_EQ(iterFabricInfo.GetFabricId(), fabricId);
709+
EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity());
709710
saw1 = true;
710711
}
711712
}
@@ -817,12 +818,14 @@ TEST_F(TestFabricTable, TestBasicAddNocUpdateNocFlow)
817818
{
818819
EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u);
819820
EXPECT_EQ(iterFabricInfo.GetFabricId(), 11u);
821+
EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity());
820822
saw1 = true;
821823
}
822824
if (iterFabricInfo.GetFabricIndex() == 2)
823825
{
824826
EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u);
825827
EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u);
828+
EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity());
826829
saw2 = true;
827830
}
828831
}
@@ -1104,7 +1107,9 @@ TEST_F(TestFabricTable, TestAddMultipleSameRootDifferentFabricId)
11041107
EXPECT_EQ(fabricTable.FabricCount(), 0);
11051108
EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR);
11061109
FabricIndex newFabricIndex = kUndefinedFabricIndex;
1107-
EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR);
1110+
EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex,
1111+
FabricTable::AdvertiseIdentity::No),
1112+
CHIP_NO_ERROR);
11081113
EXPECT_EQ(fabricTable.FabricCount(), 1);
11091114
EXPECT_EQ(newFabricIndex, 1);
11101115

@@ -1118,6 +1123,23 @@ TEST_F(TestFabricTable, TestAddMultipleSameRootDifferentFabricId)
11181123
EXPECT_EQ(fabricInfo->GetFabricId(), 1111u);
11191124
EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId);
11201125
EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u);
1126+
EXPECT_FALSE(fabricInfo->ShouldAdvertiseIdentity());
1127+
1128+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(newFabricIndex, FabricTable::AdvertiseIdentity::Yes), CHIP_NO_ERROR);
1129+
EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity());
1130+
1131+
// Check that for indices we don't have a fabric for, SetShouldAdvertiseIdentity fails.
1132+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(kUndefinedFabricIndex, FabricTable::AdvertiseIdentity::No),
1133+
CHIP_ERROR_INVALID_FABRIC_INDEX);
1134+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(kUndefinedFabricIndex, FabricTable::AdvertiseIdentity::Yes),
1135+
CHIP_ERROR_INVALID_FABRIC_INDEX);
1136+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(2, FabricTable::AdvertiseIdentity::Yes), CHIP_ERROR_INVALID_FABRIC_INDEX);
1137+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(2, FabricTable::AdvertiseIdentity::No), CHIP_ERROR_INVALID_FABRIC_INDEX);
1138+
1139+
EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity());
1140+
1141+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(newFabricIndex, FabricTable::AdvertiseIdentity::No), CHIP_NO_ERROR);
1142+
EXPECT_FALSE(fabricInfo->ShouldAdvertiseIdentity());
11211143
}
11221144
size_t numStorageKeysAfterFirstAdd = storage.GetNumKeys();
11231145
EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time
@@ -1155,6 +1177,14 @@ TEST_F(TestFabricTable, TestAddMultipleSameRootDifferentFabricId)
11551177
EXPECT_EQ(fabricInfo->GetFabricId(), 2222u);
11561178
EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId);
11571179
EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u);
1180+
1181+
EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity());
1182+
1183+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(newFabricIndex, FabricTable::AdvertiseIdentity::No), CHIP_NO_ERROR);
1184+
EXPECT_FALSE(fabricInfo->ShouldAdvertiseIdentity());
1185+
1186+
EXPECT_EQ(fabricTable.SetShouldAdvertiseIdentity(newFabricIndex, FabricTable::AdvertiseIdentity::Yes), CHIP_NO_ERROR);
1187+
EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity());
11581188
}
11591189
size_t numStorageKeysAfterSecondAdd = storage.GetNumKeys();
11601190
EXPECT_EQ(numStorageKeysAfterSecondAdd, (numStorageKeysAfterFirstAdd + 5)); // Add 3 certs, 1 metadata, 1 opkey

0 commit comments

Comments
 (0)