[nexus] update mDNS traffic to flow through infrastructure link (#12720)

Update mDNS traffic simulation in the Nexus platform to flow through
the simulated infrastructure link. This ensures mDNS packets are
automatically written to the PCAP file generated by the simulated
infrastructure link.

Changes:
- Wrap mDNS messages in UDP/IPv6 headers and enqueue them on the
  simulated infrastructure interface (InfraIf).
- Implement a new SendUdp overload in InfraIf that accepts a Message
  payload.
- Update InfraIf::Receive to intercept mDNS UDP packets (port 5353)
  and deliver them to the Mdns module.
- Remove the dedicated ProcessMdns loop and manual PendingTx list from
  Core and Mdns, consolidating traffic processing through InfraIf.
- Initialize Mdns with a reference to the Node to allow access to
  InfraIf.
- Add GetMulticastAddress static helper to Mdns for 'ff02::fb'.
This commit is contained in:
Jonathan Hui
2026-03-20 17:05:32 -05:00
committed by GitHub
parent fb216d335c
commit 5e99ebaa51
8 changed files with 181 additions and 169 deletions
+2 -19
View File
@@ -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();
-1
View File
@@ -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);
+96 -64
View File
@@ -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<Ip6::Ip6>().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<Ip6::Ip6>().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<NetworkData::Leader>().IsOnMesh(aHeader.GetSource()));
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
if (aHeader.GetDestination().IsMulticastLargerThanRealmLocal())
{
VerifyOrExit(node.Get<BackboneRouter::Local>().IsPrimary());
VerifyOrExit(node.Get<BackboneRouter::MulticastListenersTable>().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<const otIp6Address *>(&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<const otIp6Address *>(&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<Message> messagePtr;
Ip6::Header updatedHeader = aHeader;
Ip6::Header updatedHeader = headers.GetIp6Header();
VerifyOrExit(!node.mInfraIf.HasAddress(headers.GetSourceAddress()));
VerifyOrExit(!node.Get<NetworkData::Leader>().IsOnMesh(headers.GetSourceAddress()));
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
if (headers.GetDestinationAddress().IsMulticastLargerThanRealmLocal())
{
VerifyOrExit(node.Get<BackboneRouter::Local>().IsPrimary());
VerifyOrExit(node.Get<BackboneRouter::MulticastListenersTable>().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<Ip6::Ip6>().SendRaw(messagePtr.PassOwnership()));
}
Core::Get().SetActiveNode(&aSrcNode);
exit:
return;
Core::Get().SetActiveNode(&aSrcNode);
}
void InfraIf::HandleEchoRequest(const Ip6::Header &aHeader, Message &aMessage)
+11 -3
View File
@@ -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<Ip6::Address> &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);
+36 -40
View File
@@ -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
+10 -12
View File
@@ -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<PendingTx>, public LinkedListEntry<PendingTx>
{
PendingTx *mNext;
OwnedPtr<Message> 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<Ip6::Address> mIfAddresses;
OwningList<PendingTx> mPendingTxList;
static void GetMulticastAddress(Ip6::Address &aAddress);
Node *mNode;
bool mEnabled;
};
} // namespace Nexus
+1 -1
View File
@@ -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
+25 -29
View File
@@ -290,9 +290,9 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void)
VerifyOrQuit(StringStartsWith(peer->GetHostName(), "ot"));
VerifyOrQuit(StringEndsWith(peer->GetHostName(), node2.Get<Mac::Mac>().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<Mac::Mac>().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<Mac::Mac>().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<Mac::Mac>().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<ot::Trel::PeerTable>().GetHead();
VerifyOrQuit(peer != nullptr);
@@ -406,7 +406,7 @@ void TestTrelDelayedMdnsStartAndPeerRemovalDelay(void)
VerifyOrQuit(peer->GetDnssdState() == kDnssdRemoved);
VerifyOrQuit(peer->GetExtPanId() == node2.Get<MeshCoP::NetworkIdentity>().GetExtPanId());
VerifyOrQuit(peer->GetExtAddress() == node2.Get<Mac::Mac>().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<Mac::Mac>().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<Mac::Mac>().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<Mac::Mac>().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<Mac::Mac>().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++)
{