[netdata] add ServiceData and ServerData types (#6984)

This commit adds new types `NetworkData::ServiceData/ServerData`
(which use the `ot::Data` class) which help simplify different
`NetworkData` methods dealing with Service and Server TLVs.
This commit is contained in:
Abtin Keshavarzian
2021-09-16 14:50:23 -07:00
committed by Jonathan Hui
parent ca35753a1e
commit 063d7a1514
16 changed files with 372 additions and 277 deletions
+48 -43
View File
@@ -229,20 +229,24 @@ public:
{
}
template <uint8_t kSize> Error AddService(const uint8_t (&aServiceData)[kSize])
Error AddService(const ServiceData &aServiceData)
{
return Local::AddService(ServiceTlv::kThreadEnterpriseNumber, aServiceData, kSize, true, nullptr, 0);
return Local::AddService(ServiceTlv::kThreadEnterpriseNumber, aServiceData, true, ServerData());
}
template <uint8_t kSize>
Error ValidateServiceData(const ServiceTlv *aServiceTlv, const uint8_t (&aServiceData)[kSize]) const
Error ValidateServiceData(const ServiceTlv *aServiceTlv, const ServiceData &aServiceData) const
{
return
Error error = kErrorFailed;
ServiceData serviceData;
((aServiceTlv != nullptr) && (aServiceTlv->GetServiceDataLength() == kSize) &&
(memcmp(aServiceTlv->GetServiceData(), aServiceData, kSize) == 0))
? kErrorNone
: kErrorFailed;
VerifyOrExit(aServiceTlv != nullptr);
aServiceTlv->GetServiceData(serviceData);
VerifyOrExit(aServiceData == serviceData);
error = kErrorNone;
exit:
return error;
}
void Test(void)
@@ -254,52 +258,53 @@ public:
const uint8_t kServiceData5[] = {0x02, 0xab, 0xcd};
const ServiceTlv *tlv;
ServiceData serviceData1;
ServiceData serviceData2;
ServiceData serviceData3;
ServiceData serviceData4;
ServiceData serviceData5;
SuccessOrQuit(AddService(kServiceData1));
SuccessOrQuit(AddService(kServiceData2));
SuccessOrQuit(AddService(kServiceData3));
SuccessOrQuit(AddService(kServiceData4));
SuccessOrQuit(AddService(kServiceData5));
serviceData1.InitFrom(kServiceData1);
serviceData2.InitFrom(kServiceData2);
serviceData3.InitFrom(kServiceData3);
serviceData4.InitFrom(kServiceData4);
serviceData5.InitFrom(kServiceData5);
SuccessOrQuit(AddService(serviceData1));
SuccessOrQuit(AddService(serviceData2));
SuccessOrQuit(AddService(serviceData3));
SuccessOrQuit(AddService(serviceData4));
SuccessOrQuit(AddService(serviceData5));
DumpBuffer("netdata", mTlvs, mLength);
// Iterate through all entries that start with { 0x02 } (kServiceData1)
tlv = nullptr;
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData1, sizeof(kServiceData1),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData1));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData1, sizeof(kServiceData1),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData4));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData1, sizeof(kServiceData1),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData5));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData1, sizeof(kServiceData1),
kServicePrefixMatch);
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData1, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData1));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData1, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData4));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData1, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData5));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData1, kServicePrefixMatch);
VerifyOrQuit(tlv == nullptr, "FindNextService() returned extra TLV");
// Iterate through all entries that start with { 0xab } (kServiceData2)
// Iterate through all entries that start with { 0xab } (serviceData2)
tlv = nullptr;
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData2, sizeof(kServiceData2),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData2));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData2, sizeof(kServiceData2),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData3));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData2, sizeof(kServiceData2),
kServicePrefixMatch);
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData2, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData2));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData2, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData3));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData2, kServicePrefixMatch);
VerifyOrQuit(tlv == nullptr, "FindNextService() returned extra TLV");
// Iterate through all entries that start with kServiceData5
// Iterate through all entries that start with serviceData5
tlv = nullptr;
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData5, sizeof(kServiceData5),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData4));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData5, sizeof(kServiceData5),
kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, kServiceData5));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, kServiceData5, sizeof(kServiceData5),
kServicePrefixMatch);
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData5, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData4));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData5, kServicePrefixMatch);
SuccessOrQuit(ValidateServiceData(tlv, serviceData5));
tlv = FindNextService(tlv, ServiceTlv::kThreadEnterpriseNumber, serviceData5, kServicePrefixMatch);
VerifyOrQuit(tlv == nullptr, "FindNextService() returned extra TLV");
}
};