diff --git a/tests/nexus/platform/nexus_core.cpp b/tests/nexus/platform/nexus_core.cpp index bb74cb0a5..5188159c5 100644 --- a/tests/nexus/platform/nexus_core.cpp +++ b/tests/nexus/platform/nexus_core.cpp @@ -282,6 +282,7 @@ Node &Core::CreateNode(void) node->GetInstance().SetId(mCurNodeId++); node->mInfraIf.Init(*node); + node->mMdns.Init(*node); mNodes.Push(*node); @@ -362,7 +363,6 @@ void Core::Process(Node &aNode) otTaskletsProcess(&aNode.GetInstance()); ProcessRadio(aNode); - ProcessMdns(aNode); ProcessInfraIf(aNode); #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE ProcessTrel(aNode); @@ -528,23 +528,6 @@ exit: return; } -void Core::ProcessMdns(Node &aNode) -{ - Mdns::AddressInfo senderAddress; - - aNode.mMdns.GetAddress(senderAddress); - - for (Mdns::PendingTx &pendingTx : aNode.mMdns.mPendingTxList) - { - for (Node &rxNode : mNodes) - { - rxNode.mMdns.Receive(rxNode.GetInstance(), pendingTx, senderAddress); - } - } - - aNode.mMdns.mPendingTxList.Free(); -} - void Core::ProcessInfraIf(Node &aNode) { // Deliver pending packets on the infrastructure interface. @@ -616,7 +599,7 @@ void Core::ProcessInfraIf(Node &aNode) continue; } - rxNode.mInfraIf.Receive(aNode, header, *message); + rxNode.mInfraIf.Receive(aNode, *message); } message->Free(); diff --git a/tests/nexus/platform/nexus_core.hpp b/tests/nexus/platform/nexus_core.hpp index ff708f586..0c8b0620f 100644 --- a/tests/nexus/platform/nexus_core.hpp +++ b/tests/nexus/platform/nexus_core.hpp @@ -110,7 +110,6 @@ private: void Process(Node &aNode); void ProcessRadio(Node &aNode); - void ProcessMdns(Node &aNode); void ProcessInfraIf(Node &aNode); #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE void ProcessTrel(Node &aNode); diff --git a/tests/nexus/platform/nexus_infra_if.cpp b/tests/nexus/platform/nexus_infra_if.cpp index d2b66472d..b425d29ab 100644 --- a/tests/nexus/platform/nexus_infra_if.cpp +++ b/tests/nexus/platform/nexus_infra_if.cpp @@ -74,6 +74,7 @@ void InfraIf::AddAddress(const Ip6::Address &aAddress) VerifyOrExit(!HasAddress(aAddress)); SuccessOrQuit(mAddresses.PushBack(aAddress)); + mNode->mMdns.HandleHostAddressEvent(aAddress, /* aAdded */ true); exit: return; @@ -87,11 +88,18 @@ void InfraIf::RemoveAddress(const Ip6::Address &aAddress) { mAddresses[index] = *mAddresses.Back(); mAddresses.PopBack(); + mNode->mMdns.HandleHostAddressEvent(aAddress, /* aAdded */ false); break; } } } +void InfraIf::RemoveAllAddresses(void) +{ + mAddresses.Clear(); + mNode->mMdns.HandleHostAddressRemoveAll(); +} + const Ip6::Address *InfraIf::FindAddress(const char *aPrefix) const { Ip6::Prefix prefix; @@ -289,16 +297,26 @@ void InfraIf::SendUdp(const Ip6::Address &aSrcAddress, uint16_t aDestPort, uint16_t aPayloadSize) { - Message *message; + Message *message = GetNode().Get().NewMessage(); + + VerifyOrQuit(message != nullptr); + + SuccessOrQuit(message->IncreaseLength(aPayloadSize)); + SendUdp(aSrcAddress, aDestAddress, aSourcePort, aDestPort, *message); +} + +void InfraIf::SendUdp(const Ip6::Address &aSrcAddress, + const Ip6::Address &aDestAddress, + uint16_t aSourcePort, + uint16_t aDestPort, + Message &aPayload) +{ Ip6::Header ip6Header; Ip6::Udp::Header udpHeader; - message = GetNode().Get().NewMessage(); - VerifyOrQuit(message != nullptr); - ip6Header.Clear(); ip6Header.InitVersionTrafficClassFlow(); - ip6Header.SetPayloadLength(sizeof(Ip6::Udp::Header) + aPayloadSize); + ip6Header.SetPayloadLength(sizeof(Ip6::Udp::Header) + aPayload.GetLength()); ip6Header.SetNextHeader(Ip6::kProtoUdp); ip6Header.SetHopLimit(64); ip6Header.SetSource(aSrcAddress); @@ -306,94 +324,110 @@ void InfraIf::SendUdp(const Ip6::Address &aSrcAddress, udpHeader.SetSourcePort(aSourcePort); udpHeader.SetDestinationPort(aDestPort); - udpHeader.SetLength(sizeof(Ip6::Udp::Header) + aPayloadSize); + udpHeader.SetLength(sizeof(Ip6::Udp::Header) + aPayload.GetLength()); udpHeader.SetChecksum(0); - SuccessOrQuit(message->Append(udpHeader)); - SuccessOrQuit(message->IncreaseLength(aPayloadSize)); + SuccessOrQuit(aPayload.Prepend(udpHeader)); + aPayload.SetOffset(0); + Checksum::UpdateMessageChecksum(aPayload, aSrcAddress, aDestAddress, Ip6::kProtoUdp); + SuccessOrQuit(aPayload.Prepend(ip6Header)); + aPayload.SetOffset(0); - Checksum::UpdateMessageChecksum(*message, aSrcAddress, aDestAddress, Ip6::kProtoUdp); + if (aDestAddress.IsMulticast()) + { + Message *loopbackMessage = aPayload.Clone(); - SuccessOrQuit(message->Prepend(ip6Header)); + VerifyOrQuit(loopbackMessage != nullptr); + Receive(GetNode(), *loopbackMessage); + loopbackMessage->Free(); + } - mPendingTxQueue.Enqueue(*message); + mPendingTxQueue.Enqueue(aPayload); } -void InfraIf::Receive(Node &aSrcNode, const Ip6::Header &aHeader, Message &aMessage) +void InfraIf::Receive(Node &aSrcNode, Message &aMessage) { - Node &node = GetNode(); - bool isIcmp6Nd = false; - bool isEchoRequest = false; - bool isEchoReply = false; - - VerifyOrExit(!node.mInfraIf.HasAddress(aHeader.GetSource())); - VerifyOrExit(!node.Get().IsOnMesh(aHeader.GetSource())); - -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE - if (aHeader.GetDestination().IsMulticastLargerThanRealmLocal()) - { - VerifyOrExit(node.Get().IsPrimary()); - VerifyOrExit(node.Get().Has(aHeader.GetDestination())); - } -#endif + Node &node = GetNode(); + Ip6::Headers headers; Core::Get().SetActiveNode(&node); - if (aHeader.GetNextHeader() == Ip6::kProtoIcmp6 && - aMessage.GetLength() >= sizeof(Ip6::Header) + sizeof(Ip6::Icmp::Header) && - (aHeader.GetDestination() == Ip6::Address::GetLinkLocalAllNodesMulticast() || - aHeader.GetDestination() == Ip6::Address::GetLinkLocalAllRoutersMulticast() || - node.mInfraIf.HasAddress(aHeader.GetDestination()))) + aMessage.SetOffset(0); + SuccessOrExit(headers.ParseFrom(aMessage)); + + if (headers.IsIcmp6() && (headers.GetDestinationAddress() == Ip6::Address::GetLinkLocalAllNodesMulticast() || + headers.GetDestinationAddress() == Ip6::Address::GetLinkLocalAllRoutersMulticast() || + node.mInfraIf.HasAddress(headers.GetDestinationAddress()))) { - Ip6::Icmp::Header icmpHeader; - - SuccessOrQuit(aMessage.Read(sizeof(Ip6::Header), icmpHeader)); - - switch (icmpHeader.GetType()) + switch (headers.GetIcmpHeader().GetType()) { case Ip6::Icmp::Header::kTypeRouterAdvert: case Ip6::Icmp::Header::kTypeRouterSolicit: case Ip6::Icmp::Header::kTypeNeighborAdvert: case Ip6::Icmp::Header::kTypeNeighborSolicit: - isIcmp6Nd = true; - break; + { + Heap::Data payload; + uint16_t offset = sizeof(Ip6::Header); + + SuccessOrQuit(payload.SetFrom(aMessage, offset, aMessage.GetLength() - offset)); + + otPlatInfraIfRecvIcmp6Nd(&node.GetInstance(), mIfIndex, + reinterpret_cast(&headers.GetSourceAddress()), + payload.GetBytes(), payload.GetLength()); + node.mInfraIf.ProcessIcmp6Nd(headers.GetSourceAddress(), payload.GetBytes(), payload.GetLength()); + ExitNow(); + } + case Ip6::Icmp::Header::kTypeEchoRequest: - isEchoRequest = true; - break; + HandleEchoRequest(headers.GetIp6Header(), aMessage); + ExitNow(); + case Ip6::Icmp::Header::kTypeEchoReply: - isEchoReply = true; - break; + HandleEchoReply(headers.GetIp6Header(), aMessage); + ExitNow(); + default: break; } } - if (isIcmp6Nd) + if (headers.IsUdp() && headers.GetDestinationPort() == Mdns::kUdpPort) { - Heap::Data payload; - uint16_t offset = sizeof(Ip6::Header); + if (headers.GetDestinationAddress().IsMulticast() || node.mInfraIf.HasAddress(headers.GetDestinationAddress())) + { + Mdns::AddressInfo senderAddress; + Message *payload = aMessage.Clone(); - SuccessOrQuit(payload.SetFrom(aMessage, offset, aMessage.GetLength() - offset)); + VerifyOrQuit(payload != nullptr); + payload->RemoveHeader(sizeof(Ip6::Header) + sizeof(Ip6::Udp::Header)); - otPlatInfraIfRecvIcmp6Nd(&node.GetInstance(), mIfIndex, - reinterpret_cast(&aHeader.GetSource()), payload.GetBytes(), - payload.GetLength()); - node.mInfraIf.ProcessIcmp6Nd(aHeader.GetSource(), payload.GetBytes(), payload.GetLength()); + senderAddress.mAddress = headers.GetSourceAddress(); + senderAddress.mPort = headers.GetSourcePort(); + senderAddress.mInfraIfIndex = Mdns::kInfraIfIndex; + + node.mMdns.Receive(node.GetInstance(), *payload, !headers.GetDestinationAddress().IsMulticast(), + senderAddress); + payload->Free(); + } + ExitNow(); } - else if (isEchoRequest) - { - HandleEchoRequest(aHeader, aMessage); - } - else if (isEchoReply) - { - HandleEchoReply(aHeader, aMessage); - } - else + { // We also deliver generic IPv6 packets to the stack if they are NOT ICMPv6 ND packets. // (ND packets were already delivered via otPlatInfraIfRecvIcmp6Nd above). OwnedPtr messagePtr; - Ip6::Header updatedHeader = aHeader; + Ip6::Header updatedHeader = headers.GetIp6Header(); + + VerifyOrExit(!node.mInfraIf.HasAddress(headers.GetSourceAddress())); + VerifyOrExit(!node.Get().IsOnMesh(headers.GetSourceAddress())); + +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE + if (headers.GetDestinationAddress().IsMulticastLargerThanRealmLocal()) + { + VerifyOrExit(node.Get().IsPrimary()); + VerifyOrExit(node.Get().Has(headers.GetDestinationAddress())); + } +#endif VerifyOrExit(updatedHeader.GetHopLimit() > 1); updatedHeader.SetHopLimit(updatedHeader.GetHopLimit() - 1); @@ -408,10 +442,8 @@ void InfraIf::Receive(Node &aSrcNode, const Ip6::Header &aHeader, Message &aMess SuccessOrQuit(node.Get().SendRaw(messagePtr.PassOwnership())); } - Core::Get().SetActiveNode(&aSrcNode); - exit: - return; + Core::Get().SetActiveNode(&aSrcNode); } void InfraIf::HandleEchoRequest(const Ip6::Header &aHeader, Message &aMessage) diff --git a/tests/nexus/platform/nexus_infra_if.hpp b/tests/nexus/platform/nexus_infra_if.hpp index 9518467ea..b9a2c73f3 100644 --- a/tests/nexus/platform/nexus_infra_if.hpp +++ b/tests/nexus/platform/nexus_infra_if.hpp @@ -40,7 +40,7 @@ class Node; class InfraIf { public: - typedef otPlatInfraIfLinkLayerAddress LinkLayerAddress; ///< A link-layer address + typedef otPlatInfraIfLinkLayerAddress LinkLayerAddress; InfraIf(void); @@ -51,11 +51,13 @@ public: bool HasAddress(const Ip6::Address &aAddress) const; void AddAddress(const Ip6::Address &aAddress); void RemoveAddress(const Ip6::Address &aAddress); + void RemoveAllAddresses(void); const Ip6::Address *FindAddress(const char *aPrefix) const; const Ip6::Address &FindMatchingAddress(const char *aPrefix) const; - const Ip6::Address &GetLinkLocalAddress(void) const { return mAddresses[0]; } + const Ip6::Address &GetLinkLocalAddress(void) const { return mAddresses[0]; } + const Heap::Array &GetAddresses(void) const { return mAddresses; } void SendIcmp6Nd(const Ip6::Address &aDestAddress, const uint8_t *aBuffer, uint16_t aBufferLength); void SendIp6(const Ip6::Address &aSrcAddress, @@ -72,7 +74,13 @@ public: uint16_t aSourcePort, uint16_t aDestPort, uint16_t aPayloadSize); - void Receive(Node &aSrcNode, const Ip6::Header &aHeader, Message &aMessage); + void SendUdp(const Ip6::Address &aSrcAddress, + const Ip6::Address &aDestAddress, + uint16_t aSourcePort, + uint16_t aDestPort, + Message &aPayload); + + void Receive(Node &aSrcNode, Message &aMessage); void GetLinkLayerAddress(LinkLayerAddress &aLinkLayerAddress) const; typedef void (*EchoReplyHandler)(void *aContext, const Ip6::Address &aSource, uint16_t aId, uint16_t aSequence); diff --git a/tests/nexus/platform/nexus_mdns.cpp b/tests/nexus/platform/nexus_mdns.cpp index e32ba33b2..0592caf37 100644 --- a/tests/nexus/platform/nexus_mdns.cpp +++ b/tests/nexus/platform/nexus_mdns.cpp @@ -60,22 +60,14 @@ void otPlatMdnsSendUnicast(otInstance *aInstance, otMessage *aMessage, const otP // Mdns Mdns::Mdns(void) - : mEnabled(false) + : mNode(nullptr) + , mEnabled(false) { - Ip6::Address address; - Ip6::InterfaceIdentifier iid; - - iid.GenerateRandom(); - address.SetToLinkLocalAddress(iid); - - SuccessOrQuit(mIfAddresses.PushBack(address)); } -void Mdns::Reset(void) -{ - mEnabled = false; - mPendingTxList.Free(); -} +void Mdns::Init(Node &aNode) { mNode = &aNode; } + +void Mdns::Reset(void) { mEnabled = false; } Error Mdns::SetListeningEnabled(Instance &aInstance, bool aEnable, uint32_t aInfraIfIndex) { @@ -96,7 +88,7 @@ exit: void Mdns::SendMulticast(Message &aMessage, uint32_t aInfraIfIndex) { - PendingTx *pendingTx; + Ip6::Address multicastAddress; if (aInfraIfIndex != kInfraIfIndex) { @@ -104,13 +96,8 @@ void Mdns::SendMulticast(Message &aMessage, uint32_t aInfraIfIndex) ExitNow(); } - pendingTx = PendingTx::Allocate(); - VerifyOrQuit(pendingTx != nullptr); - - pendingTx->mMessage.Reset(&aMessage); - pendingTx->mIsUnicast = false; - - mPendingTxList.PushAfterTail(*pendingTx); + GetMulticastAddress(multicastAddress); + mNode->mInfraIf.SendUdp(mNode->mInfraIf.GetLinkLocalAddress(), multicastAddress, kUdpPort, kUdpPort, aMessage); exit: return; @@ -118,22 +105,14 @@ exit: void Mdns::SendUnicast(Message &aMessage, const AddressInfo &aAddress) { - PendingTx *pendingTx; - if (aAddress.mInfraIfIndex != kInfraIfIndex) { aMessage.Free(); ExitNow(); } - pendingTx = PendingTx::Allocate(); - VerifyOrQuit(pendingTx != nullptr); - - pendingTx->mMessage.Reset(&aMessage); - pendingTx->mIsUnicast = true; - pendingTx->mAddress = aAddress; - - mPendingTxList.PushAfterTail(*pendingTx); + mNode->mInfraIf.SendUdp(mNode->mInfraIf.GetLinkLocalAddress(), AsCoreType(&aAddress.mAddress), kUdpPort, + aAddress.mPort, aMessage); exit: return; @@ -143,29 +122,28 @@ void Mdns::SignalIfAddresses(Instance &aInstance) { otPlatMdnsHandleHostAddressRemoveAll(&aInstance, kInfraIfIndex); - for (const Ip6::Address &address : mIfAddresses) + for (const Ip6::Address &address : mNode->mInfraIf.GetAddresses()) { otPlatMdnsHandleHostAddressEvent(&aInstance, &address, /* aAdded */ true, kInfraIfIndex); } } -void Mdns::Receive(Instance &aInstance, const PendingTx &aPendingTx, const AddressInfo &aSenderAddress) +void Mdns::Receive(Instance &aInstance, Message &aMessage, bool aIsUnicast, const AddressInfo &aSenderAddress) { Message *message; VerifyOrExit(mEnabled); - if (aPendingTx.mIsUnicast) + if (aIsUnicast) { - VerifyOrExit(aPendingTx.mAddress.mInfraIfIndex == kInfraIfIndex); - VerifyOrExit(aPendingTx.mAddress.mPort == kUdpPort); - VerifyOrExit(mIfAddresses.Contains(AsCoreType(&aPendingTx.mAddress.mAddress))); + VerifyOrExit(aSenderAddress.mInfraIfIndex == kInfraIfIndex); + VerifyOrExit(aSenderAddress.mPort == kUdpPort); } - message = aPendingTx.mMessage->Clone(); + message = aMessage.Clone(); VerifyOrQuit(message != nullptr); - otPlatMdnsHandleReceive(&aInstance, message, aPendingTx.mIsUnicast, &aSenderAddress); + otPlatMdnsHandleReceive(&aInstance, message, aIsUnicast, &aSenderAddress); exit: return; @@ -174,10 +152,28 @@ exit: void Mdns::GetAddress(AddressInfo &aAddress) const { ClearAllBytes(aAddress); - aAddress.mAddress = mIfAddresses[0]; + aAddress.mAddress = mNode->mInfraIf.GetLinkLocalAddress(); aAddress.mPort = kUdpPort; aAddress.mInfraIfIndex = kInfraIfIndex; } +void Mdns::HandleHostAddressEvent(const Ip6::Address &aAddress, bool aAdded) +{ + if (mEnabled) + { + otPlatMdnsHandleHostAddressEvent(&mNode->GetInstance(), &aAddress, aAdded, kInfraIfIndex); + } +} + +void Mdns::HandleHostAddressRemoveAll(void) +{ + if (mEnabled) + { + otPlatMdnsHandleHostAddressRemoveAll(&mNode->GetInstance(), kInfraIfIndex); + } +} + +void Mdns::GetMulticastAddress(Ip6::Address &aAddress) { SuccessOrQuit(aAddress.FromString("ff02::fb")); } + } // namespace Nexus } // namespace ot diff --git a/tests/nexus/platform/nexus_mdns.hpp b/tests/nexus/platform/nexus_mdns.hpp index 77f9b7d2e..91f4309c2 100644 --- a/tests/nexus/platform/nexus_mdns.hpp +++ b/tests/nexus/platform/nexus_mdns.hpp @@ -34,6 +34,8 @@ namespace ot { namespace Nexus { +class Node; + class Mdns { public: @@ -42,27 +44,23 @@ public: using AddressInfo = otPlatMdnsAddressInfo; - struct PendingTx : public Heap::Allocatable, public LinkedListEntry - { - PendingTx *mNext; - OwnedPtr mMessage; - bool mIsUnicast; - AddressInfo mAddress; - }; - Mdns(void); + void Init(Node &aNode); void Reset(void); Error SetListeningEnabled(Instance &aInstance, bool aEnable, uint32_t aInfraIfIndex); void SendMulticast(Message &aMessage, uint32_t aInfraIfIndex); void SendUnicast(Message &aMessage, const AddressInfo &aAddress); void SignalIfAddresses(Instance &aInstance); - void Receive(Instance &aInstance, const PendingTx &aPendingTx, const AddressInfo &aSenderAddress); + void Receive(Instance &aInstance, Message &aMessage, bool aIsUnicast, const AddressInfo &aSenderAddress); void GetAddress(AddressInfo &aAddress) const; + void HandleHostAddressEvent(const Ip6::Address &aAddress, bool aAdded); + void HandleHostAddressRemoveAll(void); - bool mEnabled; - Heap::Array mIfAddresses; - OwningList mPendingTxList; + static void GetMulticastAddress(Ip6::Address &aAddress); + + Node *mNode; + bool mEnabled; }; } // namespace Nexus diff --git a/tests/nexus/platform/nexus_node.cpp b/tests/nexus/platform/nexus_node.cpp index 2147f7da4..e35174d72 100644 --- a/tests/nexus/platform/nexus_node.cpp +++ b/tests/nexus/platform/nexus_node.cpp @@ -188,7 +188,7 @@ exit: #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE void Node::GetTrelSockAddr(Ip6::SockAddr &aSockAddr) const { - aSockAddr.SetAddress(mMdns.mIfAddresses[0]); + aSockAddr.SetAddress(mInfraIf.GetLinkLocalAddress()); aSockAddr.SetPort(mTrel.mUdpPort); } #endif diff --git a/tests/nexus/test_trel.cpp b/tests/nexus/test_trel.cpp index d015703f8..0046d0846 100644 --- a/tests/nexus/test_trel.cpp +++ b/tests/nexus/test_trel.cpp @@ -290,9 +290,9 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void) VerifyOrQuit(StringStartsWith(peer->GetHostName(), "ot")); VerifyOrQuit(StringEndsWith(peer->GetHostName(), node2.Get().GetExtAddress().ToString().AsCString())); VerifyOrQuit(peer->GetSockAddr().GetPort() == node2.mTrel.mUdpPort); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetNext() == nullptr); // Check peer on `node2` to match `node1` info. @@ -308,9 +308,9 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void) VerifyOrQuit(StringStartsWith(peer->GetHostName(), "ot")); VerifyOrQuit(StringEndsWith(peer->GetHostName(), node1.Get().GetExtAddress().ToString().AsCString())); VerifyOrQuit(peer->GetSockAddr().GetPort() == node1.mTrel.mUdpPort); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node1.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node1.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peer->GetHostAddresses()[0] == node1.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetHostAddresses()[0] == node1.mInfraIf.GetLinkLocalAddress()); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Disable TREL Interface (and `PeerDiscoverer`) on `node2`"); @@ -360,9 +360,9 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void) VerifyOrQuit(StringStartsWith(peer->GetHostName(), "ot")); VerifyOrQuit(StringEndsWith(peer->GetHostName(), node2.Get().GetExtAddress().ToString().AsCString())); VerifyOrQuit(peer->GetSockAddr().GetPort() == node2.mTrel.mUdpPort); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetNext() == nullptr); // Check peer on `node2` to match `node1` info. @@ -378,9 +378,9 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void) VerifyOrQuit(StringStartsWith(peer->GetHostName(), "ot")); VerifyOrQuit(StringEndsWith(peer->GetHostName(), node1.Get().GetExtAddress().ToString().AsCString())); VerifyOrQuit(peer->GetSockAddr().GetPort() == node1.mTrel.mUdpPort); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node1.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node1.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peer->GetHostAddresses()[0] == node1.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetHostAddresses()[0] == node1.mInfraIf.GetLinkLocalAddress()); peer = node1.Get().GetHead(); VerifyOrQuit(peer != nullptr); @@ -406,7 +406,7 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void) VerifyOrQuit(peer->GetDnssdState() == kDnssdRemoved); VerifyOrQuit(peer->GetExtPanId() == node2.Get().GetExtPanId()); VerifyOrQuit(peer->GetExtAddress() == node2.Get().GetExtAddress()); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mInfraIf.GetLinkLocalAddress()); Log("Validate the `DetermineSecondsSinceLastInteraction()` is properly tracked"); @@ -579,27 +579,25 @@ void TestHostAddressChange(void) VerifyOrQuit(StringEndsWith(peer->GetHostName(), node2.Get().GetExtAddress().ToString().AsCString())); VerifyOrQuit(peer->GetSockAddr().GetPort() == service.mPort); - VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetSockAddr().GetAddress() == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mMdns.mIfAddresses[0]); + VerifyOrQuit(peer->GetHostAddresses()[0] == node2.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peer->GetNext() == nullptr); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Update the advertised local host addresses on `node2`"); - node2.mMdns.mIfAddresses.Clear(); + node2.mInfraIf.RemoveAllAddresses(); SuccessOrQuit(guaAddr.FromString("2001:cafe::4567")); - SuccessOrQuit(node2.mMdns.mIfAddresses.PushBack(guaAddr)); + node2.mInfraIf.AddAddress(guaAddr); SuccessOrQuit(ulaAddr.FromString("fd00:abba::1234")); - SuccessOrQuit(node2.mMdns.mIfAddresses.PushBack(ulaAddr)); + node2.mInfraIf.AddAddress(ulaAddr); SuccessOrQuit(linkLocalAddr.FromString("fe80::bd2c:a124")); - SuccessOrQuit(node2.mMdns.mIfAddresses.PushBack(linkLocalAddr)); - - node2.mMdns.SignalIfAddresses(node2.GetInstance()); + node2.mInfraIf.AddAddress(linkLocalAddr); nexus.AdvanceTime(3 * 1000); @@ -625,10 +623,10 @@ void TestHostAddressChange(void) for (const Ip6::Address &hostAddress : peer->GetHostAddresses()) { - VerifyOrQuit(node2.mMdns.mIfAddresses.Contains(hostAddress)); + VerifyOrQuit(node2.mInfraIf.HasAddress(hostAddress)); } - for (const Ip6::Address &ifAddress : node2.mMdns.mIfAddresses) + for (const Ip6::Address &ifAddress : node2.mInfraIf.GetAddresses()) { VerifyOrQuit(peer->GetHostAddresses().Contains(ifAddress)); } @@ -749,9 +747,9 @@ void TestMultiServiceSameHost(void) VerifyOrQuit(StringEndsWith(peerEntry.GetHostName(), multiServiceNode.Get().GetExtAddress().ToString().AsCString())); - VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mMdns.mIfAddresses[0]); + VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peerEntry.GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mMdns.mIfAddresses[0]); + VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mInfraIf.GetLinkLocalAddress()); for (const Dns::Multicast::Core::Service &service : services) { @@ -791,9 +789,9 @@ void TestMultiServiceSameHost(void) VerifyOrQuit(StringEndsWith(peerEntry.GetHostName(), multiServiceNode.Get().GetExtAddress().ToString().AsCString())); - VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mMdns.mIfAddresses[0]); + VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peerEntry.GetHostAddresses().GetLength() == 1); - VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mMdns.mIfAddresses[0]); + VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mInfraIf.GetLinkLocalAddress()); for (uint16_t index = 0; index < 2; index++) { @@ -810,9 +808,7 @@ void TestMultiServiceSameHost(void) Log("Update the local host addresses on `multiServiceNode`"); SuccessOrQuit(address.FromString("fd00:abba::1234")); - SuccessOrQuit(multiServiceNode.mMdns.mIfAddresses.PushBack(address)); - - multiServiceNode.mMdns.SignalIfAddresses(multiServiceNode.GetInstance()); + multiServiceNode.mInfraIf.AddAddress(address); nexus.AdvanceTime(5 * 1000); @@ -836,10 +832,10 @@ void TestMultiServiceSameHost(void) VerifyOrQuit(StringEndsWith(peerEntry.GetHostName(), multiServiceNode.Get().GetExtAddress().ToString().AsCString())); - VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mMdns.mIfAddresses[0]); + VerifyOrQuit(peerEntry.GetSockAddr().GetAddress() == multiServiceNode.mInfraIf.GetLinkLocalAddress()); VerifyOrQuit(peerEntry.GetHostAddresses().GetLength() == 2); - VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mMdns.mIfAddresses[0]); - VerifyOrQuit(peerEntry.GetHostAddresses()[1] == multiServiceNode.mMdns.mIfAddresses[1]); + VerifyOrQuit(peerEntry.GetHostAddresses()[0] == multiServiceNode.mInfraIf.GetLinkLocalAddress()); + VerifyOrQuit(peerEntry.GetHostAddresses()[1] == multiServiceNode.mInfraIf.GetAddresses()[1]); for (uint16_t index = 0; index < 2; index++) {