From 13ac7297a0010c76a10665e6230154bdd31fe5ed Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 20 Feb 2023 21:20:57 -0800 Subject: [PATCH] [routing-manager] use NA target address (#8777) This commit updates `ProcessNeighborAdvertMessage()` method in `RoutingManager` to use the Target Address included in Neighbor Advertisement to find the related `Router` (instead of sender's IPv6 address). This addresses situations where the router responding may use a different address. --- src/core/border_router/routing_manager.cpp | 16 ++++++++-------- src/core/border_router/routing_manager.hpp | 5 ++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 31b12546a..f8e3d16e1 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -363,7 +363,7 @@ void RoutingManager::HandleReceived(const InfraIf::Icmp6Packet &aPacket, const I HandleRouterSolicit(aPacket, aSrcAddress); break; case Ip6::Icmp::Header::kTypeNeighborAdvert: - HandleNeighborAdvertisement(aPacket, aSrcAddress); + HandleNeighborAdvertisement(aPacket); break; default: break; @@ -943,14 +943,14 @@ void RoutingManager::HandleRouterSolicit(const InfraIf::Icmp6Packet &aPacket, co ScheduleRoutingPolicyEvaluation(kToReplyToRs); } -void RoutingManager::HandleNeighborAdvertisement(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress) +void RoutingManager::HandleNeighborAdvertisement(const InfraIf::Icmp6Packet &aPacket) { const Ip6::Nd::NeighborAdvertMessage *naMsg; VerifyOrExit(aPacket.GetLength() >= sizeof(naMsg)); naMsg = reinterpret_cast(aPacket.GetBytes()); - mDiscoveredPrefixTable.ProcessNeighborAdvertMessage(*naMsg, aSrcAddress); + mDiscoveredPrefixTable.ProcessNeighborAdvertMessage(*naMsg); exit: return; @@ -1715,14 +1715,14 @@ void RoutingManager::DiscoveredPrefixTable::RemoveExpiredEntries(void) void RoutingManager::DiscoveredPrefixTable::SignalTableChanged(void) { mSignalTask.Post(); } void RoutingManager::DiscoveredPrefixTable::ProcessNeighborAdvertMessage( - const Ip6::Nd::NeighborAdvertMessage &aNaMessage, - const Ip6::Address &aSrcAddress) + const Ip6::Nd::NeighborAdvertMessage &aNaMessage) { - Router *router = mRouters.FindMatching(aSrcAddress); + Router *router; - VerifyOrExit(router != nullptr); VerifyOrExit(aNaMessage.IsValid()); - VerifyOrExit(aNaMessage.GetTargetAddress() == router->mAddress); + + router = mRouters.FindMatching(aNaMessage.GetTargetAddress()); + VerifyOrExit(router != nullptr); LogInfo("Received NA from router %s", router->mAddress.ToString().AsCString()); diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index a8b39d615..19e057d75 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -462,8 +462,7 @@ private: void ProcessRouterAdvertMessage(const Ip6::Nd::RouterAdvertMessage &aRaMessage, const Ip6::Address &aSrcAddress); - void ProcessNeighborAdvertMessage(const Ip6::Nd::NeighborAdvertMessage &aNaMessage, - const Ip6::Address &aSrcAddress); + void ProcessNeighborAdvertMessage(const Ip6::Nd::NeighborAdvertMessage &aNaMessage); void SetAllowDefaultRouteInNetData(bool aAllow); @@ -868,7 +867,7 @@ private: void HandleRouterAdvertisement(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress); void HandleRouterSolicit(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress); - void HandleNeighborAdvertisement(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress); + void HandleNeighborAdvertisement(const InfraIf::Icmp6Packet &aPacket); bool ShouldProcessPrefixInfoOption(const Ip6::Nd::PrefixInfoOption &aPio, const Ip6::Prefix &aPrefix); bool ShouldProcessRouteInfoOption(const Ip6::Nd::RouteInfoOption &aRio, const Ip6::Prefix &aPrefix); void UpdateDiscoveredPrefixTableOnNetDataChange(void);