From 6d0618fc78802b191e8a1ac67c56bb37da3cd1bc Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 18 Jun 2025 07:17:41 -0700 Subject: [PATCH] [routing-manager] enhance peer BR count tracking and signaling (#11594) This commit enhances how changes in the number of reachable peer Border Routers (BRs) are tracked and signaled. This tracking is handled by `RxRaTracker` and utilized by the `MultiAilDetector` to determine if BRs are connected to different AILs. The `RxRaTracker::DecisionFactors` class now includes and tracks `mReachablePeerBrCount`. This value is updated in the `Evaluate()` method, which is invoked upon any change to the internal state tracked by `RxRaTracker` (e.g., changes in discovered prefixes or routers). This ensures that any change in the number of peer BRs is promptly detected and signaled to other sub-components, allowing them to update their state or take necessary actions. --- src/core/border_router/routing_manager.cpp | 17 +++++++---------- src/core/border_router/routing_manager.hpp | 13 +++++++++---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index b88465106..64a4ae42b 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -1213,7 +1213,7 @@ void RoutingManager::MultiAilDetector::Evaluate(void) mNetDataPeerBrCount = count; } - count = Get().mRxRaTracker.CountReachablePeerBrs(); + count = Get().mRxRaTracker.GetReachablePeerBrCount(); if (count != mRxRaTrackerReachablePeerBrCount) { @@ -1812,6 +1812,10 @@ void RoutingManager::RxRaTracker::Evaluate(void) } } +#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE + mDecisionFactors.mReachablePeerBrCount = CountReachablePeerBrs(); +#endif + if (oldFactors != mDecisionFactors) { mSignalTask.Post(); @@ -2021,14 +2025,6 @@ void RoutingManager::RxRaTracker::HandleRouterTimer(void) { entry.ClearLifetime(); } - -#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE - // When a Peer BR becomes unreachable, post a task that will do multi-ail evaluation. - if (router.IsPeerBr()) - { - mSignalTask.Post(); - } -#endif } } @@ -2182,7 +2178,7 @@ exit: return error; } -#if OPENTHREAD_CONFIG_BORDER_ROUTING_TRACK_PEER_BR_INFO_ENABLE +#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE uint16_t RoutingManager::RxRaTracker::CountReachablePeerBrs(void) const { uint16_t count = 0; @@ -2198,6 +2194,7 @@ uint16_t RoutingManager::RxRaTracker::CountReachablePeerBrs(void) const return count; } #endif + //--------------------------------------------------------------------------------------------------------------------- // RxRaTracker::Iterator diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 85bd5ab5c..dcd5551fd 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -1036,6 +1036,9 @@ private: bool ContainsDefaultOrNonUlaRoutePrefix(void) const { return mDecisionFactors.mHasNonUlaRoute; } bool ContainsNonUlaOnLinkPrefix(void) const { return mDecisionFactors.mHasNonUlaOnLink; } bool ContainsUlaOnLinkPrefix(void) const { return mDecisionFactors.mHasUlaOnLink; } +#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE + uint16_t GetReachablePeerBrCount(void) const { return mDecisionFactors.mReachablePeerBrCount; } +#endif const Ip6::Prefix &GetFavoredOnLinkPrefix(void) const { return mDecisionFactors.mFavoredOnLinkPrefix; } void SetHeaderFlagsOn(RouterAdvert::Header &aHeader) const; @@ -1051,10 +1054,6 @@ private: Error GetNextRouter(PrefixTableIterator &aIterator, RouterEntry &aEntry) const; Error GetNextRdnssAddr(PrefixTableIterator &aIterator, RdnssAddrEntry &aEntry) const; -#if OPENTHREAD_CONFIG_BORDER_ROUTING_TRACK_PEER_BR_INFO_ENABLE - uint16_t CountReachablePeerBrs(void) const; -#endif - // Callbacks notifying of changes void RemoveOrDeprecateOldEntries(TimeMilli aTimeThreshold); void HandleLocalOnLinkPrefixChanged(void); @@ -1242,6 +1241,9 @@ private: bool mHasUlaOnLink : 1; bool mHeaderManagedAddressConfigFlag : 1; bool mHeaderOtherConfigFlag : 1; +#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE + uint16_t mReachablePeerBrCount; +#endif }; //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1254,6 +1256,9 @@ private: void DetermineStaleTimeFor(const OnLinkPrefix &aPrefix, NextFireTime &aStaleTime); void DetermineStaleTimeFor(const RoutePrefix &aPrefix, NextFireTime &aStaleTime); void SendNeighborSolicitToRouter(const Router &aRouter); +#if OPENTHREAD_CONFIG_BORDER_ROUTING_MULTI_AIL_DETECTION_ENABLE + uint16_t CountReachablePeerBrs(void) const; +#endif #if OPENTHREAD_CONFIG_BORDER_ROUTING_USE_HEAP_ENABLE template Entry *AllocateEntry(void) { return Entry::Allocate(); } #else