diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index cf15e4447..2afa73cac 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -648,6 +648,18 @@ exit: } } +TimeMilli RoutingManager::CalculateExpirationTime(TimeMilli aUpdateTime, uint32_t aLifetime) +{ + // `aLifetime` is in unit of seconds. We clamp the lifetime to max + // interval supported by `Timer` (`2^31` msec or ~24.8 days). + // This ensures that the time calculation fits within `TimeMilli` + // range. + + static constexpr uint32_t kMaxLifetime = Time::MsecToSec(Timer::kMaxDelay); + + return aUpdateTime + Time::SecToMsec(Min(aLifetime, kMaxLifetime)); +} + bool RoutingManager::IsValidBrUlaPrefix(const Ip6::Prefix &aBrUlaPrefix) { return aBrUlaPrefix.mLength == kBrUlaPrefixLength && aBrUlaPrefix.mPrefix.mFields.m8[0] == 0xfd; @@ -841,12 +853,10 @@ void RoutingManager::LogRouteInfoOption(const Ip6::Prefix &, uint32_t, RoutePref TimeMilli RoutingManager::LifetimedPrefix::CalculateExpirationTime(uint32_t aLifetime) const { - // `aLifetime` is in unit of seconds. We clamp the lifetime to max - // interval supported by `Timer` (`2^31` msec or ~24.8 days). + // `aLifetime` is in unit of seconds. This method ensures + // that the time calculation fits with `TimeMilli` range. - static constexpr uint32_t kMaxLifetime = Time::MsecToSec(Timer::kMaxDelay); - - return mLastUpdateTime + Time::SecToMsec(Min(aLifetime, kMaxLifetime)); + return RoutingManager::CalculateExpirationTime(mLastUpdateTime, aLifetime); } //--------------------------------------------------------------------------------------------------------------------- @@ -1514,7 +1524,14 @@ void RoutingManager::RxRaTracker::ScheduleStaleTimer(void) if (mLocalRaHeader.IsValid()) { - staleTime.UpdateIfEarlier(mLocalRaHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); + uint16_t interval = kRtrAdvStaleTime; + + if (mLocalRaHeader.GetRouterLifetime() > 0) + { + interval = Min(interval, mLocalRaHeader.GetRouterLifetime()); + } + + staleTime.UpdateIfEarlier(CalculateExpirationTime(mLocalRaHeaderUpdateTime, interval)); } mStaleTimer.FireAt(staleTime); diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 112d3b760..23959753e 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -1397,6 +1397,8 @@ private: void HandleRaPrefixTableChanged(void); void HandleLocalOnLinkPrefixChanged(void); + static TimeMilli CalculateExpirationTime(TimeMilli aUpdateTime, uint32_t aLifetime); + static bool IsValidBrUlaPrefix(const Ip6::Prefix &aBrUlaPrefix); static bool IsValidOnLinkPrefix(const PrefixInfoOption &aPio); static bool IsValidOnLinkPrefix(const Ip6::Prefix &aOnLinkPrefix);