diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index eb9e6907e..7fdde20c5 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -84,7 +84,6 @@ RoutingManager::RoutingManager(Instance &aInstance) , mPdPrefixManager(aInstance) #endif , mRsSender(aInstance) - , mDiscoveredPrefixStaleTimer(aInstance) , mRoutingPolicyTimer(aInstance) { mBrUlaPrefix.Clear(); @@ -343,8 +342,7 @@ void RoutingManager::Stop(void) SendRouterAdvertisement(kInvalidateAllPrevPrefixes); - mRxRaTracker.RemoveAllEntries(); - mDiscoveredPrefixStaleTimer.Stop(); + mRxRaTracker.Stop(); mTxRaInfo.mTxCount = 0; @@ -707,12 +705,6 @@ void RoutingManager::HandleRsSenderFinished(TimeMilli aStartTime) ScheduleRoutingPolicyEvaluation(kImmediately); } -void RoutingManager::HandleDiscoveredPrefixStaleTimer(void) -{ - LogInfo("Stale On-Link or OMR Prefixes or RA messages are detected"); - mRsSender.Start(); -} - void RoutingManager::HandleRouterSolicit(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress) { OT_UNUSED_VARIABLE(aPacket); @@ -840,7 +832,6 @@ void RoutingManager::HandleRaPrefixTableChanged(void) VerifyOrExit(mIsRunning); - ResetDiscoveredPrefixStaleTimer(); mOnLinkPrefixManager.HandleRaPrefixTableChanged(); mRoutePublisher.Evaluate(); @@ -870,34 +861,6 @@ bool RoutingManager::NetworkDataContainsUlaRoute(void) const return contains; } -void RoutingManager::ResetDiscoveredPrefixStaleTimer(void) -{ - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextStaleTime; - - OT_ASSERT(mIsRunning); - - // The stale timer triggers sending RS to check the state of - // discovered prefixes and host RA messages. - - nextStaleTime = mRxRaTracker.CalculateNextStaleTime(now); - - if (nextStaleTime == now.GetDistantFuture()) - { - if (mDiscoveredPrefixStaleTimer.IsRunning()) - { - LogDebg("Prefix stale timer stopped"); - } - - mDiscoveredPrefixStaleTimer.Stop(); - } - else - { - mDiscoveredPrefixStaleTimer.FireAt(nextStaleTime); - LogDebg("Prefix stale timer scheduled in %lu ms", ToUlong(nextStaleTime - now)); - } -} - #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO) void RoutingManager::LogPrefixInfoOption(const Ip6::Prefix &aPrefix, @@ -1059,7 +1022,8 @@ void RoutingManager::RoutePrefix::CopyInfoTo(PrefixTableEntry &aEntry, TimeMilli RoutingManager::RxRaTracker::RxRaTracker(Instance &aInstance) : InstanceLocator(aInstance) - , mEntryTimer(aInstance) + , mExpirationTimer(aInstance) + , mStaleTimer(aInstance) , mRouterTimer(aInstance) , mSignalTask(aInstance) { @@ -1210,7 +1174,7 @@ void RoutingManager::RxRaTracker::ProcessRaHeader(const RouterAdvert::Header &aR entry->SetFrom(aRaHeader); } - mEntryTimer.FireAtIfEarlier(entry->GetExpireTime()); + mExpirationTimer.FireAtIfEarlier(entry->GetExpireTime()); SignalTableChanged(); @@ -1255,7 +1219,7 @@ void RoutingManager::RxRaTracker::ProcessPrefixInfoOption(const PrefixInfoOption entry->AdoptValidAndPreferredLifetimesFrom(newPrefix); } - mEntryTimer.FireAtIfEarlier(entry->GetExpireTime()); + mExpirationTimer.FireAtIfEarlier(entry->GetExpireTime()); SignalTableChanged(); @@ -1297,7 +1261,7 @@ void RoutingManager::RxRaTracker::ProcessRouteInfoOption(const RouteInfoOption & entry->SetFrom(aRio); } - mEntryTimer.FireAtIfEarlier(entry->GetExpireTime()); + mExpirationTimer.FireAtIfEarlier(entry->GetExpireTime()); SignalTableChanged(); @@ -1472,15 +1436,15 @@ exit: return; } -void RoutingManager::RxRaTracker::RemoveAllEntries(void) +void RoutingManager::RxRaTracker::Stop(void) { - // Remove all entries from the table. - mRouters.Free(); - mEntryTimer.Stop(); - mLocalRaHeader.Clear(); + mExpirationTimer.Stop(); + mStaleTimer.Stop(); + mRouterTimer.Stop(); + SignalTableChanged(); } @@ -1550,23 +1514,26 @@ void RoutingManager::RxRaTracker::RemoveOrDeprecateEntriesFromInactiveRouters(vo RemoveExpiredEntries(); } -TimeMilli RoutingManager::RxRaTracker::CalculateNextStaleTime(TimeMilli aNow) const +void RoutingManager::RxRaTracker::ScheduleStaleTimer(void) { - TimeMilli onLinkStaleTime = aNow; - TimeMilli staleTime = aNow.GetDistantFuture(); + TimeMilli now = TimerMilli::GetNow(); + TimeMilli onLinkStaleTime = now; + TimeMilli staleTime = now.GetDistantFuture(); bool foundOnLink = false; // For on-link prefixes, we consider stale time as when all on-link // prefixes become stale (the latest stale time) but for route // prefixes we consider the earliest stale time. + mStaleTimer.Stop(); + for (const Router &router : mRouters) { for (const OnLinkPrefix &entry : router.mOnLinkPrefixes) { if (!entry.IsDeprecated()) { - TimeMilli entryStaleTime = Max(aNow, entry.GetStaleTime()); + TimeMilli entryStaleTime = Max(now, entry.GetStaleTime()); onLinkStaleTime = Max(onLinkStaleTime, entryStaleTime); foundOnLink = true; @@ -1575,7 +1542,7 @@ TimeMilli RoutingManager::RxRaTracker::CalculateNextStaleTime(TimeMilli aNow) co for (const RoutePrefix &entry : router.mRoutePrefixes) { - TimeMilli entryStaleTime = Max(aNow, entry.GetStaleTime()); + TimeMilli entryStaleTime = Max(now, entry.GetStaleTime()); staleTime = Min(staleTime, entryStaleTime); } @@ -1588,12 +1555,26 @@ TimeMilli RoutingManager::RxRaTracker::CalculateNextStaleTime(TimeMilli aNow) co if (mLocalRaHeader.IsValid()) { - TimeMilli raHeaderStaleTime = Max(aNow, mLocalRaHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); + TimeMilli raHeaderStaleTime = Max(now, mLocalRaHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); staleTime = Min(staleTime, raHeaderStaleTime); } - return staleTime; + if (staleTime != now.GetDistantFuture()) + { + mStaleTimer.FireAt(staleTime); + } +} + +void RoutingManager::RxRaTracker::HandleStaleTimer(void) +{ + VerifyOrExit(Get().IsRunning()); + + LogInfo("Stale timer expired"); + Get().mRsSender.Start(); + +exit: + return; } void RoutingManager::RxRaTracker::RemoveRoutersWithNoEntriesOrFlags(void) @@ -1601,7 +1582,7 @@ void RoutingManager::RxRaTracker::RemoveRoutersWithNoEntriesOrFlags(void) mRouters.RemoveAndFreeAllMatching(Router::kContainsNoEntriesOrFlags); } -void RoutingManager::RxRaTracker::HandleEntryTimer(void) { RemoveExpiredEntries(); } +void RoutingManager::RxRaTracker::HandleExpirationTimer(void) { RemoveExpiredEntries(); } void RoutingManager::RxRaTracker::RemoveExpiredEntries(void) { @@ -1640,12 +1621,18 @@ void RoutingManager::RxRaTracker::RemoveExpiredEntries(void) if (nextExpireTime != now.GetDistantFuture()) { - mEntryTimer.FireAt(nextExpireTime); + mExpirationTimer.FireAt(nextExpireTime); } } void RoutingManager::RxRaTracker::SignalTableChanged(void) { mSignalTask.Post(); } +void RoutingManager::RxRaTracker::HandleSignalTask(void) +{ + ScheduleStaleTimer(); + Get().HandleRaPrefixTableChanged(); +} + void RoutingManager::RxRaTracker::ProcessNeighborAdvertMessage(const NeighborAdvertMessage &aNaMessage) { Router *router; diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 824a3766c..1460ad8ad 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -719,8 +719,9 @@ private: //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void HandleRaPrefixTableChanged(void); // Declare early so we can use in `mSignalTask` - void HandleRxRaTrackerEntryTimer(void) { mRxRaTracker.HandleEntryTimer(); } + void HandleRxRaTrackerSignalTask(void) { mRxRaTracker.HandleSignalTask(); } + void HandleRxRaTrackerExpirationTimer(void) { mRxRaTracker.HandleExpirationTimer(); } + void HandleRxRaTrackerStaleTimer(void) { mRxRaTracker.HandleStaleTimer(); } void HandleRxRaTrackerRouterTimer(void) { mRxRaTracker.HandleRouterTimer(); } class RxRaTracker : public InstanceLocator @@ -740,6 +741,8 @@ private: public: explicit RxRaTracker(Instance &aInstance); + void Stop(void); + void ProcessRouterAdvertMessage(const RouterAdvert::RxMessage &aRaMessage, const Ip6::Address &aSrcAddress, RouterAdvOrigin aRaOrigin); @@ -754,20 +757,19 @@ private: void RemoveOnLinkPrefix(const Ip6::Prefix &aPrefix); void RemoveRoutePrefix(const Ip6::Prefix &aPrefix); - void RemoveAllEntries(void); void RemoveOrDeprecateOldEntries(TimeMilli aTimeThreshold); const RouterAdvert::Header &GetLocalRaHeaderToMirror(void) const { return mLocalRaHeader; } - TimeMilli CalculateNextStaleTime(TimeMilli aNow) const; - void DetermineAndSetFlags(RouterAdvert::Header &aHeader) const; void InitIterator(PrefixTableIterator &aIterator) const; Error GetNextEntry(PrefixTableIterator &aIterator, PrefixTableEntry &aEntry) const; Error GetNextRouter(PrefixTableIterator &aIterator, RouterEntry &aEntry) const; - void HandleEntryTimer(void); + void HandleSignalTask(void); + void HandleExpirationTimer(void); + void HandleStaleTimer(void); void HandleRouterTimer(void); private: @@ -901,6 +903,7 @@ private: void RemoveRoutersWithNoEntriesOrFlags(void); void RemoveExpiredEntries(void); void SignalTableChanged(void); + void ScheduleStaleTimer(void); void UpdateRouterOnRx(Router &aRouter); void SendNeighborSolicitToRouter(const Router &aRouter); #if OPENTHREAD_CONFIG_BORDER_ROUTING_USE_HEAP_ENABLE @@ -909,13 +912,15 @@ private: template Entry *AllocateEntry(void); #endif - using SignalTask = TaskletIn; - using EntryTimer = TimerMilliIn; - using RouterTimer = TimerMilliIn; - using RouterList = OwningList>; + using SignalTask = TaskletIn; + using ExpirationTimer = TimerMilliIn; + using StaleTimer = TimerMilliIn; + using RouterTimer = TimerMilliIn; + using RouterList = OwningList>; RouterList mRouters; - EntryTimer mEntryTimer; + ExpirationTimer mExpirationTimer; + StaleTimer mStaleTimer; RouterTimer mRouterTimer; SignalTask mSignalTask; RouterAdvert::Header mLocalRaHeader; @@ -1378,8 +1383,6 @@ private: void HandleRsSenderFinished(TimeMilli aStartTime); void SendRouterAdvertisement(RouterAdvTxMode aRaTxMode); - void HandleDiscoveredPrefixStaleTimer(void); - 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); @@ -1387,7 +1390,8 @@ private: bool ShouldProcessRouteInfoOption(const RouteInfoOption &aRio, const Ip6::Prefix &aPrefix); void UpdateRxRaTrackerOnNetDataChange(void); bool NetworkDataContainsUlaRoute(void) const; - void ResetDiscoveredPrefixStaleTimer(void); + + void HandleRaPrefixTableChanged(void); static bool IsValidBrUlaPrefix(const Ip6::Prefix &aBrUlaPrefix); static bool IsValidOnLinkPrefix(const PrefixInfoOption &aPio); @@ -1401,8 +1405,7 @@ private: //------------------------------------------------------------------------------------------------------------------ // Variables - using RoutingPolicyTimer = TimerMilliIn; - using DiscoveredPrefixStaleTimer = TimerMilliIn; + using RoutingPolicyTimer = TimerMilliIn; // Indicates whether the Routing Manager is running (started). bool mIsRunning; @@ -1441,8 +1444,7 @@ private: RsSender mRsSender; Heap::Data mExtraRaOptions; - DiscoveredPrefixStaleTimer mDiscoveredPrefixStaleTimer; - RoutingPolicyTimer mRoutingPolicyTimer; + RoutingPolicyTimer mRoutingPolicyTimer; }; #if !OPENTHREAD_CONFIG_BORDER_ROUTING_USE_HEAP_ENABLE