diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 5d2352037..5f7a1daaf 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -133,7 +133,7 @@ void RoutingManager::SetRouteInfoOptionPreference(RoutePreference aPreference) mRouteInfoOptionPreference = aPreference; VerifyOrExit(mIsRunning); - StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitter); + StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitterMin, kRoutingPolicyEvaluationJitterMax); exit: return; @@ -379,7 +379,7 @@ void RoutingManager::HandleNotifierEvents(Events aEvents) if (mIsRunning && aEvents.Contains(kEventThreadNetdataChanged)) { UpdateDiscoveredPrefixTableOnNetDataChange(); - StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitter); + StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitterMin, kRoutingPolicyEvaluationJitterMax); } if (aEvents.Contains(kEventThreadExtPanIdChanged)) @@ -388,7 +388,7 @@ void RoutingManager::HandleNotifierEvents(Events aEvents) if (mIsRunning) { - StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitter); + StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitterMin, kRoutingPolicyEvaluationJitterMax); } } @@ -638,11 +638,11 @@ void RoutingManager::EvaluateRoutingPolicy(void) } } -void RoutingManager::StartRoutingPolicyEvaluationJitter(uint32_t aJitterMilli) +void RoutingManager::StartRoutingPolicyEvaluationJitter(uint32_t aJitterMilliMin, uint32_t aJitterMilliMax) { OT_ASSERT(mIsRunning); - StartRoutingPolicyEvaluationDelay(Random::NonCrypto::GetUint32InRange(0, aJitterMilli)); + StartRoutingPolicyEvaluationDelay(Random::NonCrypto::GetUint32InRange(aJitterMilliMin, aJitterMilliMax)); } void RoutingManager::StartRoutingPolicyEvaluationDelay(uint32_t aDelayMilli) @@ -1048,7 +1048,7 @@ void RoutingManager::HandleRouterSolicit(const InfraIf::Icmp6Packet &aPacket, co mInfraIf.ToString().AsCString()); // Schedule routing policy evaluation with random jitter to respond with Router Advertisement. - StartRoutingPolicyEvaluationJitter(kRaReplyJitter); + StartRoutingPolicyEvaluationJitter(0, kRaReplyJitter); } void RoutingManager::HandleRouterAdvertisement(const InfraIf::Icmp6Packet &aPacket, const Ip6::Address &aSrcAddress) @@ -1163,7 +1163,7 @@ void RoutingManager::HandleDiscoveredPrefixTableChanged(void) if (newFavoredPrefix != mFavoredDiscoveredOnLinkPrefix) { - StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitter); + StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitterMin, kRoutingPolicyEvaluationJitterMax); } exit: @@ -1229,7 +1229,7 @@ void RoutingManager::UpdateRouterAdvertHeader(const Ip6::Nd::RouterAdvertMessage // reevaluate routing policy and send RA message with new // header. - StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitter); + StartRoutingPolicyEvaluationJitter(kRoutingPolicyEvaluationJitterMin, kRoutingPolicyEvaluationJitterMax); } exit: diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 747568684..31afc47fc 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -315,10 +315,13 @@ private: static constexpr uint32_t kMaxRtrAdvInterval = 600; // Max Router Advertisement Interval. In sec. static constexpr uint32_t kMinRtrAdvInterval = kMaxRtrAdvInterval / 3; // Min RA Interval. In sec. static constexpr uint32_t kMaxInitRtrAdvInterval = 16; // Max Initial RA Interval. In sec. - static constexpr uint32_t kRaReplyJitter = 500; // Jitter for sending RA after rx RS. In msec. - static constexpr uint32_t kRtrSolicitationInterval = 4; // Interval between RSs. In sec. - static constexpr uint32_t kMaxRtrSolicitationDelay = 1; // Max delay for initial solicitation. In sec. - static constexpr uint32_t kRoutingPolicyEvaluationJitter = 1000; // Jitter for routing policy evaluation. In msec. + static constexpr uint32_t kRaReplyJitter = 500; // Jitter for sending RA after rx RS. In msec. + static constexpr uint32_t kRtrSolicitationInterval = 4; // Interval between RSs. In sec. + static constexpr uint32_t kMaxRtrSolicitationDelay = 1; // Max delay for initial solicitation. In sec. + static constexpr uint32_t kRoutingPolicyEvaluationJitterMin = + 2000; // Min jitter for routing policy evaluation. In msec. + static constexpr uint32_t kRoutingPolicyEvaluationJitterMax = + 4000; // Max jitter for routing policy evaluation. In msec. static constexpr uint32_t kRtrSolicitationRetryDelay = kRtrSolicitationInterval; // The delay before retrying failed RS tx. In Sec. static constexpr uint32_t kMinDelayBetweenRtrAdvs = 3000; // Min delay (msec) between consecutive RAs. @@ -336,6 +339,8 @@ private: static_assert(kDefaultOnLinkPrefixLifetime >= kMaxRtrAdvInterval, "invalid default on-link prefix lifetime"); static_assert(kRtrAdvStaleTime >= 1800 && kRtrAdvStaleTime <= kDefaultOnLinkPrefixLifetime, "invalid RA STALE time"); + static_assert(kRoutingPolicyEvaluationJitterMax > kRoutingPolicyEvaluationJitterMin, + "kRoutingPolicyEvaluationJitterMax must be larger than kRoutingPolicyEvaluationJitterMin"); enum RouterAdvTxMode : uint8_t // Used in `SendRouterAdvertisement()` { @@ -636,7 +641,7 @@ private: #endif void EvaluateRoutingPolicy(void); - void StartRoutingPolicyEvaluationJitter(uint32_t aJitterMilli); + void StartRoutingPolicyEvaluationJitter(uint32_t aJitterMilliMin, uint32_t aJitterMilliMax); void StartRoutingPolicyEvaluationDelay(uint32_t aDelayMilli); void EvaluateOmrPrefix(void); Error PublishExternalRoute(const Ip6::Prefix &aPrefix, RoutePreference aRoutePreference, bool aNat64 = false);