From d0895415dad26665e030b063cd5fda194ccd05b7 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 16 Aug 2024 10:27:14 -0700 Subject: [PATCH] [netdata] update `GetNextDnsSrpUnicastInfo()` to use `Type` (#10616) This commit updates `Service::Manager::GetNextDnsSrpUnicastInfo()` to accept a `DnsSrpUnicast::Type`, indicating the desired entry type (either `kFromServiceData` or `kFromServerData`). This simplifies the code, which previously iterated over all types and performed type checks. Additionally, this change simplifies the `Publisher` methods used for counting existing DNS/SRP unicast entries of different types. --- src/core/net/srp_client.cpp | 26 ++----- src/core/net/srp_client.hpp | 2 +- src/core/thread/address_resolver.cpp | 8 +- src/core/thread/network_data_publisher.cpp | 87 +++++----------------- src/core/thread/network_data_publisher.hpp | 9 ++- src/core/thread/network_data_service.cpp | 61 ++++++++------- src/core/thread/network_data_service.hpp | 10 +-- tests/unit/test_network_data.cpp | 65 ++++++++++------ 8 files changed, 117 insertions(+), 151 deletions(-) diff --git a/src/core/net/srp_client.cpp b/src/core/net/srp_client.cpp index 15c6c6efc..a8a7473c8 100644 --- a/src/core/net/srp_client.cpp +++ b/src/core/net/srp_client.cpp @@ -2378,7 +2378,7 @@ exit: return; } -Error Client::SelectUnicastEntry(DnsSrpUnicast::Origin aOrigin, DnsSrpUnicast::Info &aInfo) const +Error Client::SelectUnicastEntry(DnsSrpUnicast::Type aType, DnsSrpUnicast::Info &aInfo) const { Error error = kErrorNotFound; DnsSrpUnicast::Info unicastInfo; @@ -2393,13 +2393,8 @@ Error Client::SelectUnicastEntry(DnsSrpUnicast::Origin aOrigin, DnsSrpUnicast::I } #endif - while (Get().GetNextDnsSrpUnicastInfo(iterator, unicastInfo) == kErrorNone) + while (Get().GetNextDnsSrpUnicastInfo(iterator, aType, unicastInfo) == kErrorNone) { - if (unicastInfo.mOrigin != aOrigin) - { - continue; - } - if (mAutoStart.HasSelectedServer() && (GetServerAddress() == unicastInfo.mSockAddr)) { aInfo = unicastInfo; @@ -2441,9 +2436,9 @@ void Client::SelectNextServer(bool aDisallowSwitchOnRegisteredHost) // restarts the client with the new server (keeping the retry wait // interval as before). - Ip6::SockAddr serverSockAddr; - bool selectNext = false; - DnsSrpUnicast::Origin origin = DnsSrpUnicast::kFromServiceData; + Ip6::SockAddr serverSockAddr; + bool selectNext = false; + DnsSrpUnicast::Type type = DnsSrpUnicast::kFromServiceData; serverSockAddr.Clear(); @@ -2455,11 +2450,11 @@ void Client::SelectNextServer(bool aDisallowSwitchOnRegisteredHost) switch (mAutoStart.GetState()) { case AutoStart::kSelectedUnicastPreferred: - origin = DnsSrpUnicast::kFromServiceData; + type = DnsSrpUnicast::kFromServiceData; break; case AutoStart::kSelectedUnicast: - origin = DnsSrpUnicast::kFromServerData; + type = DnsSrpUnicast::kFromServerData; break; case AutoStart::kSelectedAnycast: @@ -2485,13 +2480,8 @@ void Client::SelectNextServer(bool aDisallowSwitchOnRegisteredHost) DnsSrpUnicast::Info unicastInfo; NetworkData::Service::Manager::Iterator iterator; - while (Get().GetNextDnsSrpUnicastInfo(iterator, unicastInfo) == kErrorNone) + while (Get().GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo) == kErrorNone) { - if (unicastInfo.mOrigin != origin) - { - continue; - } - if (selectNext) { serverSockAddr = unicastInfo.mSockAddr; diff --git a/src/core/net/srp_client.hpp b/src/core/net/srp_client.hpp index d3d28ebd3..33731668a 100644 --- a/src/core/net/srp_client.hpp +++ b/src/core/net/srp_client.hpp @@ -1110,7 +1110,7 @@ private: #if OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE void ApplyAutoStartGuardOnAttach(void); void ProcessAutoStart(void); - Error SelectUnicastEntry(DnsSrpUnicast::Origin aOrigin, DnsSrpUnicast::Info &aInfo) const; + Error SelectUnicastEntry(DnsSrpUnicast::Type aType, DnsSrpUnicast::Info &aInfo) const; void HandleGuardTimer(void) {} #if OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE void SelectNextServer(bool aDisallowSwitchOnRegisteredHost); diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index b3f2b0336..78d5890d9 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -602,16 +602,12 @@ Error AddressResolver::ResolveUsingNetDataServices(const Ip6::Address &aEid, uin Error error = kErrorNotFound; NetworkData::Service::Manager::Iterator iterator; NetworkData::Service::DnsSrpUnicast::Info unicastInfo; + NetworkData::Service::DnsSrpUnicast::Type type = NetworkData::Service::DnsSrpUnicast::kFromServerData; VerifyOrExit(Get().GetDeviceMode().GetNetworkDataType() == NetworkData::kFullSet); - while (Get().GetNextDnsSrpUnicastInfo(iterator, unicastInfo) == kErrorNone) + while (Get().GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo) == kErrorNone) { - if (unicastInfo.mOrigin != NetworkData::Service::DnsSrpUnicast::kFromServerData) - { - continue; - } - if (aEid == unicastInfo.mSockAddr.GetAddress()) { aRloc16 = unicastInfo.mRloc16; diff --git a/src/core/thread/network_data_publisher.cpp b/src/core/thread/network_data_publisher.cpp index 5bf16d30e..2a12dc42e 100644 --- a/src/core/thread/network_data_publisher.cpp +++ b/src/core/thread/network_data_publisher.cpp @@ -44,7 +44,6 @@ #include "common/random.hpp" #include "instance/instance.hpp" #include "thread/network_data_local.hpp" -#include "thread/network_data_service.hpp" namespace ot { namespace NetworkData { @@ -661,12 +660,12 @@ void Publisher::DnsSrpServiceEntry::Process(void) case kTypeUnicastMeshLocalEid: { Service::DnsSrpAnycast::Info anycastInfo; - bool hasServiceDataEntry; - CountServerDataUnicastEntries(numEntries, numPreferredEntries, hasServiceDataEntry); + CountUnicastEntries(Service::DnsSrpUnicast::kFromServerData, numEntries, numPreferredEntries); desiredNumEntries = kDesiredNumUnicast; - if (hasServiceDataEntry || (Get().FindPreferredDnsSrpAnycastInfo(anycastInfo) == kErrorNone)) + if (HasAnyServiceDataUnicastEntry() || + (Get().FindPreferredDnsSrpAnycastInfo(anycastInfo) == kErrorNone)) { // If there is any service data unicast entry or anycast // entry, we set the desired number of server data @@ -681,7 +680,7 @@ void Publisher::DnsSrpServiceEntry::Process(void) case kTypeUnicast: desiredNumEntries = kDesiredNumUnicast; - CountServiceDataUnicastEntries(numEntries, numPreferredEntries); + CountUnicastEntries(Service::DnsSrpUnicast::kFromServiceData, numEntries, numPreferredEntries); break; } @@ -722,81 +721,33 @@ void Publisher::DnsSrpServiceEntry::CountAnycastEntries(uint8_t &aNumEntries, ui } } -void Publisher::DnsSrpServiceEntry::CountServerDataUnicastEntries(uint8_t &aNumEntries, - uint8_t &aNumPreferredEntries, - bool &aHasServiceDataEntry) const +void Publisher::DnsSrpServiceEntry::CountUnicastEntries(Service::DnsSrpUnicast::Type aType, + uint8_t &aNumEntries, + uint8_t &aNumPreferredEntries) const { - // Count the number of server data DNS/SRP unicast entries in the - // Network Data. Also determine whether there is any service data - // DNS/SRP unicast entry (update `aHasServiceDataEntry`). + // Count the number of DNS/SRP unicast entries in the Network Data. - const ServiceTlv *serviceTlv = nullptr; - ServiceData data; + Service::Manager::Iterator iterator; + Service::DnsSrpUnicast::Info unicastInfo; - aHasServiceDataEntry = false; - - data.InitFrom(Service::DnsSrpUnicast::kServiceData); - - while ((serviceTlv = Get().FindNextThreadService(serviceTlv, data, NetworkData::kServicePrefixMatch)) != - nullptr) + while (Get().GetNextDnsSrpUnicastInfo(iterator, aType, unicastInfo) == kErrorNone) { - TlvIterator subTlvIterator(*serviceTlv); - const ServerTlv *serverSubTlv; + aNumEntries++; - if (serviceTlv->GetServiceDataLength() >= sizeof(Service::DnsSrpUnicast::ServiceData)) + if (IsPreferred(unicastInfo.mRloc16)) { - aHasServiceDataEntry = true; - } - - while (((serverSubTlv = subTlvIterator.Iterate())) != nullptr) - { - if (serverSubTlv->GetServerDataLength() < sizeof(Service::DnsSrpUnicast::ServerData)) - { - continue; - } - - aNumEntries++; - - if (IsPreferred(serverSubTlv->GetServer16())) - { - aNumPreferredEntries++; - } + aNumPreferredEntries++; } } } -void Publisher::DnsSrpServiceEntry::CountServiceDataUnicastEntries(uint8_t &aNumEntries, - uint8_t &aNumPreferredEntries) const +bool Publisher::DnsSrpServiceEntry::HasAnyServiceDataUnicastEntry(void) const { - // Count the number of service data DNS/SRP unicast entries in - // the Network Data. + Service::Manager::Iterator iterator; + Service::DnsSrpUnicast::Info unicastInfo; + Service::DnsSrpUnicast::Type type = Service::DnsSrpUnicast::kFromServiceData; - const ServiceTlv *serviceTlv = nullptr; - ServiceData data; - - data.InitFrom(Service::DnsSrpUnicast::kServiceData); - - while ((serviceTlv = Get().FindNextThreadService(serviceTlv, data, NetworkData::kServicePrefixMatch)) != - nullptr) - { - TlvIterator subTlvIterator(*serviceTlv); - const ServerTlv *serverSubTlv; - - if (serviceTlv->GetServiceDataLength() < sizeof(Service::DnsSrpUnicast::ServiceData)) - { - continue; - } - - while (((serverSubTlv = subTlvIterator.Iterate())) != nullptr) - { - aNumEntries++; - - if (IsPreferred(serverSubTlv->GetServer16())) - { - aNumPreferredEntries++; - } - } - } + return (Get().GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo) == kErrorNone); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/core/thread/network_data_publisher.hpp b/src/core/thread/network_data_publisher.hpp index 4503efb1e..0ef546b93 100644 --- a/src/core/thread/network_data_publisher.hpp +++ b/src/core/thread/network_data_publisher.hpp @@ -56,6 +56,7 @@ #include "common/string.hpp" #include "common/timer.hpp" #include "net/ip6_address.hpp" +#include "thread/network_data_service.hpp" #include "thread/network_data_types.hpp" namespace ot { @@ -437,10 +438,10 @@ private: void Notify(Event aEvent) const; void Process(void); void CountAnycastEntries(uint8_t &aNumEntries, uint8_t &aNumPreferredEntries) const; - void CountServiceDataUnicastEntries(uint8_t &aNumEntries, uint8_t &aNumPreferredEntries) const; - void CountServerDataUnicastEntries(uint8_t &aNumEntries, - uint8_t &aNumPreferredEntries, - bool &aHasServiceDataEntry) const; + void CountUnicastEntries(Service::DnsSrpUnicast::Type aType, + uint8_t &aNumEntries, + uint8_t &aNumPreferredEntries) const; + bool HasAnyServiceDataUnicastEntry(void) const; Info mInfo; Callback mCallback; diff --git a/src/core/thread/network_data_service.cpp b/src/core/thread/network_data_service.cpp index 2891e4c57..c11c03ef4 100644 --- a/src/core/thread/network_data_service.cpp +++ b/src/core/thread/network_data_service.cpp @@ -260,21 +260,44 @@ exit: return error; } -Error Manager::GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Info &aInfo) const +Error Manager::GetNextDnsSrpUnicastInfo(Iterator &aIterator, + DnsSrpUnicast::Type aType, + DnsSrpUnicast::Info &aInfo) const { - Error error = kErrorNone; - ServiceData serviceData; + Error error = kErrorNone; - serviceData.InitFrom(DnsSrpUnicast::kServiceData); - - while (true) + do { + ServiceData serviceData; + // Process Server sub-TLVs in the current Service TLV. while (IterateToNextServer(aIterator) == kErrorNone) { ServerData data; + if (aType == DnsSrpUnicast::kFromServiceData) + { + const DnsSrpUnicast::ServiceData *dnsServiceData; + + if (aIterator.mServiceTlv->GetServiceDataLength() < sizeof(DnsSrpUnicast::ServiceData)) + { + // Break from `while(IterateToNextServer())` loop + // to skip over the Service TLV and all its + // sub-TLVs and go to the next one. + break; + } + + aIterator.mServiceTlv->GetServiceData(serviceData); + dnsServiceData = reinterpret_cast(serviceData.GetBytes()); + aInfo.mSockAddr.SetAddress(dnsServiceData->GetAddress()); + aInfo.mSockAddr.SetPort(dnsServiceData->GetPort()); + aInfo.mRloc16 = aIterator.mServerSubTlv->GetServer16(); + ExitNow(); + } + + // `aType` is `kFromServerData`. + // Server sub-TLV can contain address and port info // (then we parse and return the info), or it can be // empty (then we skip over it). @@ -288,7 +311,6 @@ Error Manager::GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Info aInfo.mSockAddr.SetAddress(serverData->GetAddress()); aInfo.mSockAddr.SetPort(serverData->GetPort()); - aInfo.mOrigin = DnsSrpUnicast::kFromServerData; aInfo.mRloc16 = aIterator.mServerSubTlv->GetServer16(); ExitNow(); } @@ -301,7 +323,6 @@ Error Manager::GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Info aInfo.mSockAddr.GetAddress().SetToRoutingLocator(Get().GetMeshLocalPrefix(), aIterator.mServerSubTlv->GetServer16()); aInfo.mSockAddr.SetPort(BigEndian::ReadUint16(data.GetBytes())); - aInfo.mOrigin = DnsSrpUnicast::kFromServerData; aInfo.mRloc16 = aIterator.mServerSubTlv->GetServer16(); ExitNow(); } @@ -309,29 +330,17 @@ Error Manager::GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Info // Find the next matching Service TLV. + serviceData.InitFrom(DnsSrpUnicast::kServiceData); aIterator.mServiceTlv = Get().FindNextThreadService(aIterator.mServiceTlv, serviceData, NetworkData::kServicePrefixMatch); + aIterator.mServerSubTlv = nullptr; - VerifyOrExit(aIterator.mServiceTlv != nullptr, error = kErrorNotFound); + // If we have a valid Service TLV, restart the loop + // to process its Server sub-TLVs. - if (aIterator.mServiceTlv->GetServiceDataLength() >= sizeof(DnsSrpUnicast::ServiceData)) - { - // The Service TLV data contains the address and port info. + } while (aIterator.mServiceTlv != nullptr); - const DnsSrpUnicast::ServiceData *dnsServiceData; - - aIterator.mServiceTlv->GetServiceData(serviceData); - dnsServiceData = reinterpret_cast(serviceData.GetBytes()); - aInfo.mSockAddr.SetAddress(dnsServiceData->GetAddress()); - aInfo.mSockAddr.SetPort(dnsServiceData->GetPort()); - aInfo.mOrigin = DnsSrpUnicast::kFromServiceData; - aInfo.mRloc16 = Mle::kInvalidRloc16; - ExitNow(); - } - - // Go back to the start of `while (true)` loop to - // process the Server sub-TLVs in the new Service TLV. - } + error = kErrorNotFound; exit: return error; diff --git a/src/core/thread/network_data_service.hpp b/src/core/thread/network_data_service.hpp index 6fca444aa..356ad072d 100644 --- a/src/core/thread/network_data_service.hpp +++ b/src/core/thread/network_data_service.hpp @@ -238,10 +238,10 @@ public: static const uint8_t kServiceData = kServiceNumber; /** - * Represents the origin a `DnsSrpUnicast` entry. + * Represents the `DnsSrpUnicast` entry type. * */ - enum Origin : uint8_t + enum Type : uint8_t { kFromServiceData, ///< Socket address is from service data. kFromServerData, ///< Socket address is from server data. @@ -254,8 +254,7 @@ public: struct Info { Ip6::SockAddr mSockAddr; ///< The socket address (IPv6 address and port) of the DNS/SRP server. - Origin mOrigin; ///< The origin of the socket address (whether from service or server data). - uint16_t mRloc16; ///< The BR RLOC16 adding the entry (only used when `mOrigin == kFromServerData`). + uint16_t mRloc16; ///< The BR RLOC16 adding the entry. }; /** @@ -581,13 +580,14 @@ public: * method). * * @param[in,out] aIterator A reference to an iterator. + * @param[in] aType The entry type, `kFromServiceData` (preferred) or `kFromServerData` (non-preferred). * @param[out] aInfo A reference to `DnsSrpUnicast::Info` to return the info. * * @retval kErrorNone Successfully got the next info. @p aInfo and @p aIterator are updated. * @retval kErrorNotFound No more matching entries in the Network Data. * */ - Error GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Info &aInfo) const; + Error GetNextDnsSrpUnicastInfo(Iterator &aIterator, DnsSrpUnicast::Type aType, DnsSrpUnicast::Info &aInfo) const; private: #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE diff --git a/tests/unit/test_network_data.cpp b/tests/unit/test_network_data.cpp index 4740a2fff..8a1b4a721 100644 --- a/tests/unit/test_network_data.cpp +++ b/tests/unit/test_network_data.cpp @@ -612,11 +612,6 @@ void TestNetworkDataFindNextService(void) void TestNetworkDataDsnSrpServices(void) { - static const char *kOriginStrings[] = { - "service-data", // (0) Service::DnsSrpUnicast::kFromServiceData - "server-data", // (1) Service::DnsSrpUnicast::kFromServerData - }; - class TestLeader : public Leader { public: @@ -652,19 +647,18 @@ void TestNetworkDataDsnSrpServices(void) struct UnicastEntry { - const char *mAddress; - uint16_t mPort; - Service::DnsSrpUnicast::Origin mOrigin; - uint16_t mRloc16; + const char *mAddress; + uint16_t mPort; + uint16_t mRloc16; - bool Matches(Service::DnsSrpUnicast::Info aInfo) const + bool Matches(const Service::DnsSrpUnicast::Info &aInfo) const { Ip6::SockAddr sockAddr; SuccessOrQuit(sockAddr.GetAddress().FromString(mAddress)); sockAddr.SetPort(mPort); - return (aInfo.mSockAddr == sockAddr) && (aInfo.mOrigin == mOrigin) && (aInfo.mRloc16 == mRloc16); + return (aInfo.mSockAddr == sockAddr) && (aInfo.mRloc16 == mRloc16); } }; @@ -684,12 +678,17 @@ void TestNetworkDataDsnSrpServices(void) {0xfc12, 0x03}, }; - const UnicastEntry kUnicastEntries[] = { - {"fdde:ad00:beef:0:2d0e:c627:5556:18d9", 0x1234, Service::DnsSrpUnicast::kFromServiceData, 0xfffe}, - {"fd00:aabb:ccdd:eeff:11:2233:4455:6677", 0xabcd, Service::DnsSrpUnicast::kFromServerData, 0x6c00}, - {"fdde:ad00:beef:0:0:ff:fe00:2800", 0x5678, Service::DnsSrpUnicast::kFromServerData, 0x2800}, - {"fd00:1234:5678:9abc:def0:123:4567:89ab", 0x0e, Service::DnsSrpUnicast::kFromServerData, 0x4c00}, - {"fdde:ad00:beef:0:0:ff:fe00:6c00", 0xcd12, Service::DnsSrpUnicast::kFromServerData, 0x6c00}, + const UnicastEntry kUnicastEntriesFromServerData[] = { + {"fd00:aabb:ccdd:eeff:11:2233:4455:6677", 0xabcd, 0x6c00}, + {"fdde:ad00:beef:0:0:ff:fe00:2800", 0x5678, 0x2800}, + {"fd00:1234:5678:9abc:def0:123:4567:89ab", 0x0e, 0x4c00}, + {"fdde:ad00:beef:0:0:ff:fe00:6c00", 0xcd12, 0x6c00}, + }; + + const UnicastEntry kUnicastEntriesFromServiceData[] = { + {"fdde:ad00:beef:0:2d0e:c627:5556:18d9", 0x1234, 0x0000}, + {"fdde:ad00:beef:0:2d0e:c627:5556:18d9", 0x1234, 0x6c00}, + {"fdde:ad00:beef:0:2d0e:c627:5556:18d9", 0x1234, 0x2800}, }; const uint16_t kExpectedRlocs[] = {0x6c00, 0x2800, 0x4c00, 0x0000}; @@ -700,6 +699,7 @@ void TestNetworkDataDsnSrpServices(void) Service::Manager::Iterator iterator; Service::DnsSrpAnycast::Info anycastInfo; Service::DnsSrpUnicast::Info unicastInfo; + Service::DnsSrpUnicast::Type type; Rlocs rlocs; reinterpret_cast(instance->Get()).Populate(kNetworkData, sizeof(kNetworkData)); @@ -749,20 +749,39 @@ void TestNetworkDataDsnSrpServices(void) "FindPreferredDnsSrpAnycastInfo() returned invalid info"); printf("\n\n- - - - - - - - - - - - - - - - - - - -"); - printf("\nDNS/SRP Unicast Service entries\n"); + printf("\nDNS/SRP Unicast Service entries (server data)\n"); iterator.Clear(); + type = Service::DnsSrpUnicast::kFromServerData; - for (const UnicastEntry &entry : kUnicastEntries) + for (const UnicastEntry &entry : kUnicastEntriesFromServerData) { - SuccessOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, unicastInfo)); - printf("\nunicastInfo { %s, origin:%s, rloc16:%04x }", unicastInfo.mSockAddr.ToString().AsCString(), - kOriginStrings[unicastInfo.mOrigin], unicastInfo.mRloc16); + SuccessOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo)); + printf("\nunicastInfo { %s, rloc16:%04x }", unicastInfo.mSockAddr.ToString().AsCString(), + unicastInfo.mRloc16); VerifyOrQuit(entry.Matches(unicastInfo), "GetNextDnsSrpUnicastInfo() returned incorrect info"); } - VerifyOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, unicastInfo) == kErrorNotFound, + VerifyOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo) == kErrorNotFound, + "GetNextDnsSrpUnicastInfo() returned unexpected extra entry"); + + printf("\n\n- - - - - - - - - - - - - - - - - - - -"); + printf("\nDNS/SRP Unicast Service entries (service data)\n"); + + iterator.Clear(); + type = Service::DnsSrpUnicast::kFromServiceData; + + for (const UnicastEntry &entry : kUnicastEntriesFromServiceData) + { + SuccessOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo)); + printf("\nunicastInfo { %s, rloc16:%04x }", unicastInfo.mSockAddr.ToString().AsCString(), + unicastInfo.mRloc16); + + VerifyOrQuit(entry.Matches(unicastInfo), "GetNextDnsSrpUnicastInfo() returned incorrect info"); + } + + VerifyOrQuit(manager.GetNextDnsSrpUnicastInfo(iterator, type, unicastInfo) == kErrorNotFound, "GetNextDnsSrpUnicastInfo() returned unexpected extra entry"); printf("\n");