diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 9d2ec8454..253a25466 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -72,11 +72,7 @@ RoutingManager::RoutingManager(Instance &aInstance) #if OPENTHREAD_CONFIG_BORDER_ROUTING_NAT64_ENABLE , mInfraIfNat64PrefixStaleTimer(aInstance, HandleInfraIfNat64PrefixStaleTimer) #endif - , mTimeRouterAdvMessageLastUpdate(TimerMilli::GetNow()) - , mLearntRouterAdvMessageFromHost(false) , mDiscoveredPrefixStaleTimer(aInstance, HandleDiscoveredPrefixStaleTimer) - , mRouterAdvertisementCount(0) - , mLastRouterAdvertisementSendTime(TimerMilli::GetNow() - kMinDelayBetweenRtrAdvs) , mRouterSolicitTimer(aInstance, HandleRouterSolicitTimer) , mRouterSolicitCount(0) , mRoutingPolicyTimer(aInstance, HandleRoutingPolicyTimer) @@ -332,7 +328,7 @@ void RoutingManager::Stop(void) mDiscoveredPrefixTable.RemoveAllEntries(); mDiscoveredPrefixStaleTimer.Stop(); - mRouterAdvertisementCount = 0; + mRaInfo.mTxCount = 0; mRouterSolicitTimer.Stop(); mRouterSolicitCount = 0; @@ -633,7 +629,7 @@ void RoutingManager::EvaluateRoutingPolicy(void) nextSendDelay = Random::NonCrypto::GetUint32InRange(kMinRtrAdvInterval, kMaxRtrAdvInterval); - if (mRouterAdvertisementCount <= kMaxInitRtrAdvertisements && nextSendDelay > kMaxInitRtrAdvInterval) + if (mRaInfo.mTxCount <= kMaxInitRtrAdvertisements && nextSendDelay > kMaxInitRtrAdvInterval) { nextSendDelay = kMaxInitRtrAdvInterval; } @@ -653,7 +649,7 @@ void RoutingManager::StartRoutingPolicyEvaluationDelay(uint32_t aDelayMilli) { TimeMilli now = TimerMilli::GetNow(); TimeMilli evaluateTime = now + aDelayMilli; - TimeMilli earliestTime = mLastRouterAdvertisementSendTime + kMinDelayBetweenRtrAdvs; + TimeMilli earliestTime = mRaInfo.mLastTxTime + kMinDelayBetweenRtrAdvs; evaluateTime = Max(evaluateTime, earliestTime); @@ -717,7 +713,7 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode) 2 * kMaxOnMeshPrefixes * (sizeof(Ip6::Nd::RouteInfoOption) + sizeof(Ip6::Prefix)); uint8_t buffer[kMaxRaLength]; - Ip6::Nd::RouterAdvertMessage raMsg(mRouterAdvertHeader, buffer); + Ip6::Nd::RouterAdvertMessage raMsg(mRaInfo.mHeader, buffer); NetworkData::Iterator iterator; NetworkData::OnMeshPrefixConfig prefixConfig; @@ -840,7 +836,7 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode) Error error; Ip6::Address destAddress; - ++mRouterAdvertisementCount; + ++mRaInfo.mTxCount; destAddress.SetToLinkLocalAllNodesMulticast(); @@ -848,7 +844,7 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode) if (error == kErrorNone) { - mLastRouterAdvertisementSendTime = TimerMilli::GetNow(); + mRaInfo.mLastTxTime = TimerMilli::GetNow(); LogInfo("Sent Router Advertisement on %s", mInfraIf.ToString().AsCString()); DumpDebg("[BR-CERT] direction=send | type=RA |", raMsg.GetAsPacket().GetBytes(), raMsg.GetAsPacket().GetLength()); @@ -1000,7 +996,7 @@ void RoutingManager::HandleRouterSolicitTimer(void) mDiscoveredPrefixTable.RemoveOrDeprecateOldEntries(mTimeRouterSolicitStart); // Invalidate the learned RA message if it is not refreshed during Router Solicitation. - if (mTimeRouterAdvMessageLastUpdate <= mTimeRouterSolicitStart) + if (mRaInfo.mHeaderUpdateTime <= mTimeRouterSolicitStart) { UpdateRouterAdvertHeader(/* aRouterAdvertMessage */ nullptr); } @@ -1194,7 +1190,7 @@ bool RoutingManager::NetworkDataContainsOmrPrefix(const Ip6::Prefix &aPrefix) co void RoutingManager::UpdateRouterAdvertHeader(const Ip6::Nd::RouterAdvertMessage *aRouterAdvertMessage) { - // Updates the `mRouterAdvertHeader` from the given RA message. + // Updates the `mRaInfo` from the given RA message. Ip6::Nd::RouterAdvertMessage::Header oldHeader; @@ -1206,28 +1202,28 @@ void RoutingManager::UpdateRouterAdvertHeader(const Ip6::Nd::RouterAdvertMessage VerifyOrExit(!IsReceivedRouterAdvertFromManager(*aRouterAdvertMessage)); } - oldHeader = mRouterAdvertHeader; - mTimeRouterAdvMessageLastUpdate = TimerMilli::GetNow(); + oldHeader = mRaInfo.mHeader; + mRaInfo.mHeaderUpdateTime = TimerMilli::GetNow(); if (aRouterAdvertMessage == nullptr || aRouterAdvertMessage->GetHeader().GetRouterLifetime() == 0) { - mRouterAdvertHeader.SetToDefault(); - mLearntRouterAdvMessageFromHost = false; + mRaInfo.mHeader.SetToDefault(); + mRaInfo.mIsHeaderFromHost = false; } else { - // The checksum is set to zero in `mRouterAdvertHeader` + // The checksum is set to zero in `mRaInfo.mHeader` // which indicates to platform that it needs to do the // calculation and update it. - mRouterAdvertHeader = aRouterAdvertMessage->GetHeader(); - mRouterAdvertHeader.SetChecksum(0); - mLearntRouterAdvMessageFromHost = true; + mRaInfo.mHeader = aRouterAdvertMessage->GetHeader(); + mRaInfo.mHeader.SetChecksum(0); + mRaInfo.mIsHeaderFromHost = true; } ResetDiscoveredPrefixStaleTimer(); - if (mRouterAdvertHeader != oldHeader) + if (mRaInfo.mHeader != oldHeader) { // If there was a change to the header, start timer to // reevaluate routing policy and send RA message with new @@ -1253,9 +1249,9 @@ void RoutingManager::ResetDiscoveredPrefixStaleTimer(void) nextStaleTime = mDiscoveredPrefixTable.CalculateNextStaleTime(now); // Check for stale Router Advertisement Message if learnt from Host. - if (mLearntRouterAdvMessageFromHost) + if (mRaInfo.mIsHeaderFromHost) { - TimeMilli raStaleTime = Max(now, mTimeRouterAdvMessageLastUpdate + Time::SecToMsec(kRtrAdvStaleTime)); + TimeMilli raStaleTime = Max(now, mRaInfo.mHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); nextStaleTime = Min(nextStaleTime, raStaleTime); } diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 83b382ab7..747568684 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -595,6 +595,30 @@ private: void MarkAsDeleted(const OnMeshPrefix &aPrefix); }; + struct RaInfo + { + // Tracks info about emitted RA messages: Number of RAs sent, + // last tx time, header to use and whether the header is + // discovered from receiving RAs from the host itself. This + // ensures that if an entity on host is advertising certain + // info in its RA header (e.g., a default route), the RAs we + // emit from `RoutingManager` also include the same header. + + RaInfo(void) + : mHeaderUpdateTime(TimerMilli::GetNow()) + , mIsHeaderFromHost(false) + , mTxCount(0) + , mLastTxTime(TimerMilli::GetNow() - kMinDelayBetweenRtrAdvs) + { + } + + Ip6::Nd::RouterAdvertMessage::Header mHeader; + TimeMilli mHeaderUpdateTime; + bool mIsHeaderFromHost; + uint32_t mTxCount; + TimeMilli mLastTxTime; + }; + void EvaluateState(void); void Start(void); void Stop(void); @@ -694,18 +718,10 @@ private: TimerMilli mInfraIfNat64PrefixStaleTimer; #endif - // The RA header and parameters for the infra interface. - // This value is initialized with `RouterAdvMessage::SetToDefault` - // and updated with RA messages initiated from infra interface. - Ip6::Nd::RouterAdvertMessage::Header mRouterAdvertHeader; - TimeMilli mTimeRouterAdvMessageLastUpdate; - bool mLearntRouterAdvMessageFromHost; + RaInfo mRaInfo; TimerMilli mDiscoveredPrefixStaleTimer; - uint32_t mRouterAdvertisementCount; - TimeMilli mLastRouterAdvertisementSendTime; - TimerMilli mRouterSolicitTimer; TimeMilli mTimeRouterSolicitStart; uint8_t mRouterSolicitCount;