mirror of
https://github.com/espressif/openthread.git
synced 2026-07-30 15:47:46 +00:00
[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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user