[routing-manager] schedule all timers in RxRaTracker together (#10343)

This commit adds `RxRaTracker::ScheduleAllTimers()`, which is called
whenever there is a change in tracked information about routers and
their advertised on-link or route prefixes. This method determines
the next router expiration time (to initiate NS probes), the next
prefix entry expiration, and the next stale time, then schedules all
the timers. This centralizes all timer calculations and simplifies
the code.
This commit is contained in:
Abtin Keshavarzian
2024-06-11 08:39:58 -07:00
committed by GitHub
parent 5dbbab175b
commit d9bb516f0d
2 changed files with 29 additions and 31 deletions
+28 -30
View File
@@ -1490,8 +1490,13 @@ void RoutingManager::RxRaTracker::RemoveOrDeprecateEntriesFromInactiveRouters(vo
RemoveExpiredEntries(); RemoveExpiredEntries();
} }
void RoutingManager::RxRaTracker::ScheduleStaleTimer(void) void RoutingManager::RxRaTracker::ScheduleAllTimers(void)
{ {
TimeMilli now = TimerMilli::GetNow();
NextFireTime routerTimeout(now);
NextFireTime entryExpireTime(now);
NextFireTime staleTime(now);
// If multiple routers advertise the same on-link or route prefix, // If multiple routers advertise the same on-link or route prefix,
// the stale time for the prefix is determined by the latest stale // the stale time for the prefix is determined by the latest stale
// time among all corresponding entries. // time among all corresponding entries.
@@ -1502,8 +1507,6 @@ void RoutingManager::RxRaTracker::ScheduleStaleTimer(void)
// their entries, `DetermineStaleTimeFor()` will consider all // their entries, `DetermineStaleTimeFor()` will consider all
// matching entries and mark "StaleTimeCalculated" flag on them. // matching entries and mark "StaleTimeCalculated" flag on them.
NextFireTime staleTime;
for (Router &router : mRouters) for (Router &router : mRouters)
{ {
for (OnLinkPrefix &entry : router.mOnLinkPrefixes) for (OnLinkPrefix &entry : router.mOnLinkPrefixes)
@@ -1519,8 +1522,17 @@ void RoutingManager::RxRaTracker::ScheduleStaleTimer(void)
for (const Router &router : mRouters) for (const Router &router : mRouters)
{ {
if ((router.mNsProbeCount <= Router::kMaxNsProbes) && !router.mIsLocalDevice)
{
// Skip if router is this device or has failed all
// earlier NS probes.
routerTimeout.UpdateIfEarlier(router.mTimeout);
}
for (const OnLinkPrefix &entry : router.mOnLinkPrefixes) for (const OnLinkPrefix &entry : router.mOnLinkPrefixes)
{ {
entryExpireTime.UpdateIfEarlier(entry.GetExpireTime());
if (!entry.IsStaleTimeCalculated()) if (!entry.IsStaleTimeCalculated())
{ {
DetermineStaleTimeFor(entry, staleTime); DetermineStaleTimeFor(entry, staleTime);
@@ -1529,6 +1541,8 @@ void RoutingManager::RxRaTracker::ScheduleStaleTimer(void)
for (const RoutePrefix &entry : router.mRoutePrefixes) for (const RoutePrefix &entry : router.mRoutePrefixes)
{ {
entryExpireTime.UpdateIfEarlier(entry.GetExpireTime());
if (!entry.IsStaleTimeCalculated()) if (!entry.IsStaleTimeCalculated())
{ {
DetermineStaleTimeFor(entry, staleTime); DetermineStaleTimeFor(entry, staleTime);
@@ -1548,6 +1562,8 @@ void RoutingManager::RxRaTracker::ScheduleStaleTimer(void)
staleTime.UpdateIfEarlier(CalculateExpirationTime(mLocalRaHeaderUpdateTime, interval)); staleTime.UpdateIfEarlier(CalculateExpirationTime(mLocalRaHeaderUpdateTime, interval));
} }
mRouterTimer.FireAt(routerTimeout);
mExpirationTimer.FireAt(entryExpireTime);
mStaleTimer.FireAt(staleTime); mStaleTimer.FireAt(staleTime);
} }
@@ -1630,12 +1646,12 @@ void RoutingManager::RxRaTracker::HandleExpirationTimer(void) { RemoveExpiredEnt
void RoutingManager::RxRaTracker::RemoveExpiredEntries(void) void RoutingManager::RxRaTracker::RemoveExpiredEntries(void)
{ {
NextFireTime nextExpireTime; TimeMilli now = TimerMilli::GetNow();
bool didRemove = false; bool didRemove = false;
for (Router &router : mRouters) for (Router &router : mRouters)
{ {
LifetimedPrefix::ExpirationChecker expirationChecker(nextExpireTime.GetNow()); LifetimedPrefix::ExpirationChecker expirationChecker(now);
didRemove |= router.mOnLinkPrefixes.RemoveAndFreeAllMatching(expirationChecker); didRemove |= router.mOnLinkPrefixes.RemoveAndFreeAllMatching(expirationChecker);
didRemove |= router.mRoutePrefixes.RemoveAndFreeAllMatching(expirationChecker); didRemove |= router.mRoutePrefixes.RemoveAndFreeAllMatching(expirationChecker);
@@ -1648,29 +1664,14 @@ void RoutingManager::RxRaTracker::RemoveExpiredEntries(void)
SignalTableChanged(); SignalTableChanged();
} }
// Determine the next expire time and schedule timer. ScheduleAllTimers();
for (const Router &router : mRouters)
{
for (const OnLinkPrefix &entry : router.mOnLinkPrefixes)
{
nextExpireTime.UpdateIfEarlier(entry.GetExpireTime());
}
for (const RoutePrefix &entry : router.mRoutePrefixes)
{
nextExpireTime.UpdateIfEarlier(entry.GetExpireTime());
}
}
mExpirationTimer.FireAt(nextExpireTime);
} }
void RoutingManager::RxRaTracker::SignalTableChanged(void) { mSignalTask.Post(); } void RoutingManager::RxRaTracker::SignalTableChanged(void) { mSignalTask.Post(); }
void RoutingManager::RxRaTracker::HandleSignalTask(void) void RoutingManager::RxRaTracker::HandleSignalTask(void)
{ {
ScheduleStaleTimer(); ScheduleAllTimers();
Get<RoutingManager>().HandleRaPrefixTableChanged(); Get<RoutingManager>().HandleRaPrefixTableChanged();
} }
@@ -1702,7 +1703,7 @@ void RoutingManager::RxRaTracker::UpdateRouterOnRx(Router &aRouter)
void RoutingManager::RxRaTracker::HandleRouterTimer(void) void RoutingManager::RxRaTracker::HandleRouterTimer(void)
{ {
NextFireTime nextTime; TimeMilli now = TimerMilli::GetNow();
for (Router &router : mRouters) for (Router &router : mRouters)
{ {
@@ -1720,7 +1721,7 @@ void RoutingManager::RxRaTracker::HandleRouterTimer(void)
continue; continue;
} }
if (router.mTimeout <= nextTime.GetNow()) if (router.mTimeout <= now)
{ {
router.mNsProbeCount++; router.mNsProbeCount++;
@@ -1731,19 +1732,16 @@ void RoutingManager::RxRaTracker::HandleRouterTimer(void)
continue; continue;
} }
router.mTimeout = router.mTimeout = now + ((router.mNsProbeCount < Router::kMaxNsProbes) ? Router::kNsProbeRetryInterval
nextTime.GetNow() + ((router.mNsProbeCount < Router::kMaxNsProbes) ? Router::kNsProbeRetryInterval
: Router::kNsProbeTimeout); : Router::kNsProbeTimeout);
SendNeighborSolicitToRouter(router); SendNeighborSolicitToRouter(router);
} }
nextTime.UpdateIfEarlier(router.mTimeout);
} }
RemoveOrDeprecateEntriesFromInactiveRouters(); RemoveOrDeprecateEntriesFromInactiveRouters();
mRouterTimer.FireAt(nextTime); ScheduleAllTimers();
} }
void RoutingManager::RxRaTracker::SendNeighborSolicitToRouter(const Router &aRouter) void RoutingManager::RxRaTracker::SendNeighborSolicitToRouter(const Router &aRouter)
+1 -1
View File
@@ -918,7 +918,7 @@ private:
void RemoveRoutersWithNoEntriesOrFlags(void); void RemoveRoutersWithNoEntriesOrFlags(void);
void RemoveExpiredEntries(void); void RemoveExpiredEntries(void);
void SignalTableChanged(void); void SignalTableChanged(void);
void ScheduleStaleTimer(void); void ScheduleAllTimers(void);
void DetermineStaleTimeFor(const OnLinkPrefix &aPrefix, NextFireTime &aStaleTime); void DetermineStaleTimeFor(const OnLinkPrefix &aPrefix, NextFireTime &aStaleTime);
void DetermineStaleTimeFor(const RoutePrefix &aPrefix, NextFireTime &aStaleTime); void DetermineStaleTimeFor(const RoutePrefix &aPrefix, NextFireTime &aStaleTime);
void UpdateRouterOnRx(Router &aRouter); void UpdateRouterOnRx(Router &aRouter);