[routing-manager] move handling of prefix stale timer to RxRaTracker (#10265)

This commit moves the scheduling and handling of the stale timer to
`RxRaTracker`. This aligns with the responsibility of this class
managing all discovered on-link/route prefixes and the locally
generated RA header to mirror.
This commit is contained in:
Abtin Keshavarzian
2024-05-20 08:54:50 -07:00
committed by GitHub
parent 42d567d089
commit e36c513ab7
2 changed files with 63 additions and 74 deletions
+43 -56
View File
@@ -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<RoutingManager>().IsRunning());
LogInfo("Stale timer expired");
Get<RoutingManager>().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<RoutingManager>().HandleRaPrefixTableChanged();
}
void RoutingManager::RxRaTracker::ProcessNeighborAdvertMessage(const NeighborAdvertMessage &aNaMessage)
{
Router *router;
+20 -18
View File
@@ -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 <class Type> Entry<Type> *AllocateEntry(void);
#endif
using SignalTask = TaskletIn<RoutingManager, &RoutingManager::HandleRaPrefixTableChanged>;
using EntryTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleRxRaTrackerEntryTimer>;
using RouterTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleRxRaTrackerRouterTimer>;
using RouterList = OwningList<Entry<Router>>;
using SignalTask = TaskletIn<RoutingManager, &RoutingManager::HandleRxRaTrackerSignalTask>;
using ExpirationTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleRxRaTrackerExpirationTimer>;
using StaleTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleRxRaTrackerStaleTimer>;
using RouterTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleRxRaTrackerRouterTimer>;
using RouterList = OwningList<Entry<Router>>;
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<RoutingManager, &RoutingManager::EvaluateRoutingPolicy>;
using DiscoveredPrefixStaleTimer = TimerMilliIn<RoutingManager, &RoutingManager::HandleDiscoveredPrefixStaleTimer>;
using RoutingPolicyTimer = TimerMilliIn<RoutingManager, &RoutingManager::EvaluateRoutingPolicy>;
// 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