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