From d805b5dd1c9d69d6aef274d5db700db0311ebcc7 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 19 Oct 2022 15:49:59 -0700 Subject: [PATCH] [routing-manager] add `OnLinkPrefixManager` (#8285) This commit renames `LocalOnPreifx` class to `OnLinkPrefixManager` and moves all the code related to managing of the on-link prefix to this class, e.g., method `Evaluate()` to evaluate and make a decision about on-link prefix (whether we need to advertise our local on-link prefix or there is a favored discovered on-link prefix provided by another router on infra link). --- src/core/border_router/routing_manager.cpp | 299 +++++++++++---------- src/core/border_router/routing_manager.hpp | 31 ++- 2 files changed, 172 insertions(+), 158 deletions(-) diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 05c1e9ef8..007240069 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -69,7 +69,7 @@ RoutingManager::RoutingManager(Instance &aInstance) , mInfraIf(aInstance) , mLocalOmrPrefix(aInstance) , mRouteInfoOptionPreference(NetworkData::kRoutePreferenceMedium) - , mLocalOnLinkPrefix(aInstance) + , mOnLinkPrefixManager(aInstance) , mDiscoveredPrefixTable(aInstance) #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE , mNat64PrefixManager(aInstance) @@ -78,8 +78,6 @@ RoutingManager::RoutingManager(Instance &aInstance) , mDiscoveredPrefixStaleTimer(aInstance) , mRoutingPolicyTimer(aInstance) { - mFavoredDiscoveredOnLinkPrefix.Clear(); - mBrUlaPrefix.Clear(); } @@ -94,7 +92,7 @@ Error RoutingManager::Init(uint32_t aInfraIfIndex, bool aInfraIfIsRunning) #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE mNat64PrefixManager.GenerateLocalPrefix(mBrUlaPrefix); #endif - mLocalOnLinkPrefix.Generate(); + mOnLinkPrefixManager.GenerateLocalPrefix(); error = mInfraIf.HandleStateChanged(mInfraIf.GetIfIndex(), aInfraIfIsRunning); @@ -163,7 +161,7 @@ Error RoutingManager::GetOnLinkPrefix(Ip6::Prefix &aPrefix) Error error = kErrorNone; VerifyOrExit(IsInitialized(), error = kErrorInvalidState); - aPrefix = mLocalOnLinkPrefix.GetPrefix(); + aPrefix = mOnLinkPrefixManager.GetLocalPrefix(); exit: return error; @@ -252,7 +250,7 @@ void RoutingManager::Start(void) mIsRunning = true; UpdateDiscoveredPrefixTableOnNetDataChange(); - mLocalOnLinkPrefix.Start(); + mOnLinkPrefixManager.Start(); mRsSender.Start(); #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE mNat64PrefixManager.Start(); @@ -267,9 +265,7 @@ void RoutingManager::Stop(void) mLocalOmrPrefix.RemoveFromNetData(); mFavoredOmrPrefix.Clear(); - mFavoredDiscoveredOnLinkPrefix.Clear(); - - mLocalOnLinkPrefix.Stop(); + mOnLinkPrefixManager.Stop(); #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE mNat64PrefixManager.Stop(); @@ -358,13 +354,13 @@ void RoutingManager::HandleNotifierEvents(Events aEvents) if (mIsRunning && aEvents.Contains(kEventThreadNetdataChanged)) { UpdateDiscoveredPrefixTableOnNetDataChange(); - mLocalOnLinkPrefix.HandleNetDataChange(); + mOnLinkPrefixManager.HandleNetDataChange(); ScheduleRoutingPolicyEvaluation(kAfterRandomDelay); } if (aEvents.Contains(kEventThreadExtPanIdChanged)) { - mLocalOnLinkPrefix.HandleExtPanIdChange(); + mOnLinkPrefixManager.HandleExtPanIdChange(); if (mIsRunning) { @@ -490,7 +486,7 @@ void RoutingManager::EvaluatePublishingPrefix(const Ip6::Prefix &aPrefix) shouldPublish = mDiscoveredPrefixTable.ShouldPublish(routeConfig); - if (mLocalOnLinkPrefix.ShouldPublish(routeConfig)) + if (mOnLinkPrefixManager.ShouldPublish(routeConfig)) { shouldPublish = true; } @@ -522,60 +518,6 @@ exit: return; } -void RoutingManager::EvaluateOnLinkPrefix(void) -{ - VerifyOrExit(!mRsSender.IsInProgress()); - - mDiscoveredPrefixTable.FindFavoredOnLinkPrefix(mFavoredDiscoveredOnLinkPrefix); - - if ((mFavoredDiscoveredOnLinkPrefix.GetLength() == 0) || - (mFavoredDiscoveredOnLinkPrefix == mLocalOnLinkPrefix.GetPrefix())) - { - // We need to advertise our local on-link prefix when there is - // no discovered on-link prefix. If the favored discovered - // prefix is the same as our local on-link prefix we also - // start advertising the local prefix to add redundancy. Note - // that local on-link prefix is derived from extended PAN ID - // and therefore is the same for all BRs on the same Thread - // mesh. - - mLocalOnLinkPrefix.PublishAndAdvertise(); - - // We remove the local on-link prefix from discovered prefix - // table, in case it was previously discovered and included in - // the table (now as a deprecating entry). We remove it with - // `kKeepInNetData` flag to ensure that the prefix is not - // unpublished from network data. - // - // Note that `ShouldProcessPrefixInfoOption()` will also check - // not allow the local on-link prefix to be added in the prefix - // table while we are advertising it. - - mDiscoveredPrefixTable.RemoveOnLinkPrefix(mLocalOnLinkPrefix.GetPrefix()); - - mFavoredDiscoveredOnLinkPrefix.Clear(); - } - else if (mLocalOnLinkPrefix.IsPublishingOrAdvertising()) - { - // When an application-specific on-link prefix is received and - // it is larger than the local prefix, we will not remove the - // advertised local prefix. In this case, there will be two - // on-link prefixes on the infra link. But all BRs will still - // converge to the same smallest/favored on-link prefix and the - // application-specific prefix is not used. - - if (!(mLocalOnLinkPrefix.GetPrefix() < mFavoredDiscoveredOnLinkPrefix)) - { - LogInfo("EvaluateOnLinkPrefix: There is already favored on-link prefix %s on %s", - mFavoredDiscoveredOnLinkPrefix.ToString().AsCString(), mInfraIf.ToString().AsCString()); - mLocalOnLinkPrefix.Deprecate(); - } - } - -exit: - return; -} - // This method evaluate the routing policy depends on prefix and route // information on Thread Network and infra link. As a result, this // method May send RA messages on infra link and publish/unpublish @@ -586,7 +528,7 @@ void RoutingManager::EvaluateRoutingPolicy(void) LogInfo("Evaluating routing policy"); - EvaluateOnLinkPrefix(); + mOnLinkPrefixManager.Evaluate(); EvaluateOmrPrefix(); #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE mNat64PrefixManager.Evaluate(); @@ -617,8 +559,7 @@ bool RoutingManager::IsInitalPolicyEvaluationDone(void) const // the emitted Router Advert message on infrastructure side // and published in the Thread Network Data. - return mIsRunning && !mFavoredOmrPrefix.IsEmpty() && - (mFavoredDiscoveredOnLinkPrefix.GetLength() != 0 || mLocalOnLinkPrefix.IsPublishingOrAdvertising()); + return mIsRunning && !mFavoredOmrPrefix.IsEmpty() && mOnLinkPrefixManager.IsInitalEvaluationDone(); } void RoutingManager::ScheduleRoutingPolicyEvaluation(ScheduleMode aMode) @@ -682,7 +623,7 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode) // advertised or deprecated and for old prefix if is being // deprecated. - mLocalOnLinkPrefix.AppendAsPiosTo(raMsg); + mOnLinkPrefixManager.AppendAsPiosTo(raMsg); // Determine which previously advertised prefixes need to be // invalidated. Under `kInvalidateAllPrevPrefixes` mode we need @@ -851,7 +792,7 @@ bool RoutingManager::IsReceivedRouterAdvertFromManager(const Ip6::Nd::RouterAdve if (pio.GetPreferredLifetime() > 0) { - VerifyOrExit(prefix == mLocalOnLinkPrefix.GetPrefix()); + VerifyOrExit(prefix == mOnLinkPrefixManager.GetLocalPrefix()); } break; @@ -1001,9 +942,9 @@ bool RoutingManager::ShouldProcessPrefixInfoOption(const Ip6::Nd::PrefixInfoOpti ExitNow(); } - if (mLocalOnLinkPrefix.IsPublishingOrAdvertising()) + if (mOnLinkPrefixManager.IsPublishingOrAdvertising()) { - VerifyOrExit(aPrefix != mLocalOnLinkPrefix.GetPrefix()); + VerifyOrExit(aPrefix != mOnLinkPrefixManager.GetLocalPrefix()); } shouldProcess = true; @@ -1059,22 +1000,12 @@ exit: void RoutingManager::HandleDiscoveredPrefixTableChanged(void) { // This is a callback from `mDiscoveredPrefixTable` indicating that - // there has been a change in the table. If the favored on-link - // prefix has changed, we trigger a re-evaluation of the routing - // policy. - - Ip6::Prefix newFavoredPrefix; + // there has been a change in the table. VerifyOrExit(mIsRunning); ResetDiscoveredPrefixStaleTimer(); - - mDiscoveredPrefixTable.FindFavoredOnLinkPrefix(newFavoredPrefix); - - if (newFavoredPrefix != mFavoredDiscoveredOnLinkPrefix) - { - ScheduleRoutingPolicyEvaluation(kAfterRandomDelay); - } + mOnLinkPrefixManager.HandleDiscoveredPrefixTableChanged(); exit: return; @@ -1975,49 +1906,51 @@ exit: } //--------------------------------------------------------------------------------------------------------------------- -// LocalOnLinkPrefix +// OnLinkPrefixManager -RoutingManager::LocalOnLinkPrefix::LocalOnLinkPrefix(Instance &aInstance) +RoutingManager::OnLinkPrefixManager::OnLinkPrefixManager(Instance &aInstance) : InstanceLocator(aInstance) , mState(kIdle) , mTimer(aInstance) { - mPrefix.Clear(); - mOldPrefix.Clear(); + mLocalPrefix.Clear(); + mFavoredDiscoveredPrefix.Clear(); + mOldLocalPrefix.Clear(); } -void RoutingManager::LocalOnLinkPrefix::Generate(void) +void RoutingManager::OnLinkPrefixManager::GenerateLocalPrefix(void) { MeshCoP::ExtendedPanId extPanId = Get().GetExtPanId(); - mPrefix.mPrefix.mFields.m8[0] = 0xfd; + mLocalPrefix.mPrefix.mFields.m8[0] = 0xfd; // Global ID: 40 most significant bits of Extended PAN ID - memcpy(mPrefix.mPrefix.mFields.m8 + 1, extPanId.m8, 5); + memcpy(mLocalPrefix.mPrefix.mFields.m8 + 1, extPanId.m8, 5); // Subnet ID: 16 least significant bits of Extended PAN ID - memcpy(mPrefix.mPrefix.mFields.m8 + 6, extPanId.m8 + 6, 2); - mPrefix.SetLength(kOnLinkPrefixLength); + memcpy(mLocalPrefix.mPrefix.mFields.m8 + 6, extPanId.m8 + 6, 2); + mLocalPrefix.SetLength(kOnLinkPrefixLength); - LogNote("Local on-link prefix: %s", mPrefix.ToString().AsCString()); + LogNote("Local on-link prefix: %s", mLocalPrefix.ToString().AsCString()); } -void RoutingManager::LocalOnLinkPrefix::Start(void) +void RoutingManager::OnLinkPrefixManager::Start(void) { mState = kIdle; } -void RoutingManager::LocalOnLinkPrefix::Stop(void) +void RoutingManager::OnLinkPrefixManager::Stop(void) { mTimer.Stop(); + mFavoredDiscoveredPrefix.Clear(); - if (mOldPrefix.GetLength() != 0) + if (mOldLocalPrefix.GetLength() != 0) { - Get().UnpublishExternalRoute(mOldPrefix); - mOldPrefix.Clear(); + Get().UnpublishExternalRoute(mOldLocalPrefix); + mOldLocalPrefix.Clear(); } VerifyOrExit(mState != kIdle); - Get().UnpublishExternalRoute(mPrefix); + Get().UnpublishExternalRoute(mLocalPrefix); if (mState == kPublishing) { @@ -2038,7 +1971,88 @@ exit: return; } -void RoutingManager::LocalOnLinkPrefix::PublishAndAdvertise(void) +void RoutingManager::OnLinkPrefixManager::Evaluate(void) +{ + VerifyOrExit(!Get().mRsSender.IsInProgress()); + + Get().mDiscoveredPrefixTable.FindFavoredOnLinkPrefix(mFavoredDiscoveredPrefix); + + if ((mFavoredDiscoveredPrefix.GetLength() == 0) || (mFavoredDiscoveredPrefix == mLocalPrefix)) + { + // We need to advertise our local on-link prefix when there is + // no discovered on-link prefix. If the favored discovered + // prefix is the same as our local on-link prefix we also + // start advertising the local prefix to add redundancy. Note + // that local on-link prefix is derived from extended PAN ID + // and therefore is the same for all BRs on the same Thread + // mesh. + + PublishAndAdvertise(); + + // We remove the local on-link prefix from discovered prefix + // table, in case it was previously discovered and included in + // the table (now as a deprecating entry). We remove it with + // `kKeepInNetData` flag to ensure that the prefix is not + // unpublished from network data. + // + // Note that `ShouldProcessPrefixInfoOption()` will also check + // not allow the local on-link prefix to be added in the prefix + // table while we are advertising it. + + Get().mDiscoveredPrefixTable.RemoveOnLinkPrefix(mLocalPrefix); + + mFavoredDiscoveredPrefix.Clear(); + } + else if (IsPublishingOrAdvertising()) + { + // When an application-specific on-link prefix is received and + // it is larger than the local prefix, we will not remove the + // advertised local prefix. In this case, there will be two + // on-link prefixes on the infra link. But all BRs will still + // converge to the same smallest/favored on-link prefix and the + // application-specific prefix is not used. + + if (!(mLocalPrefix < mFavoredDiscoveredPrefix)) + { + LogInfo("EvaluateOnLinkPrefix: There is already favored on-link prefix %s", + mFavoredDiscoveredPrefix.ToString().AsCString()); + Deprecate(); + } + } + +exit: + return; +} + +bool RoutingManager::OnLinkPrefixManager::IsInitalEvaluationDone(void) const +{ + // This method indicates whether or not we are done with the + // initial policy evaluation of the on-link prefixes, i.e., either + // we have discovered a favored on-link prefix (being advertised by + // another router on infra link) or we are advertising our local + // on-link prefix. + + return (mFavoredDiscoveredPrefix.GetLength() != 0 || IsPublishingOrAdvertising()); +} + +void RoutingManager::OnLinkPrefixManager::HandleDiscoveredPrefixTableChanged(void) +{ + // This is a callback from `mDiscoveredPrefixTable` indicating that + // there has been a change in the table. If the favored on-link + // prefix has changed, we trigger a re-evaluation of the routing + // policy. + + Ip6::Prefix newFavoredPrefix; + + Get().mDiscoveredPrefixTable.FindFavoredOnLinkPrefix(newFavoredPrefix); + + if (newFavoredPrefix != mFavoredDiscoveredPrefix) + { + Get().ScheduleRoutingPolicyEvaluation(kAfterRandomDelay); + } +} + +void RoutingManager::OnLinkPrefixManager::PublishAndAdvertise(void) { // Start publishing and advertising the local on-link prefix if // not already. @@ -2055,16 +2069,16 @@ void RoutingManager::LocalOnLinkPrefix::PublishAndAdvertise(void) } mState = kPublishing; - LogInfo("Publishing local on-link prefix %s in netdata", mPrefix.ToString().AsCString()); + LogInfo("Publishing local on-link prefix %s in netdata", mLocalPrefix.ToString().AsCString()); - Get().EvaluatePublishingPrefix(mPrefix); + Get().EvaluatePublishingPrefix(mLocalPrefix); // We wait for the prefix to be added in Network Data before // starting to advertise it in RAs. However, if it is already // present in Network Data (e.g., added by another BR on the same // Thread mesh), we can immediately start advertising it. - if (Get().NetworkDataContainsExternalRoute(mPrefix)) + if (Get().NetworkDataContainsExternalRoute(mLocalPrefix)) { EnterAdvertisingState(); } @@ -2073,7 +2087,7 @@ exit: return; } -void RoutingManager::LocalOnLinkPrefix::Deprecate(void) +void RoutingManager::OnLinkPrefixManager::Deprecate(void) { // Deprecate the local on-link prefix if it was being advertised // before. While depreciating the prefix, we wait for the lifetime @@ -2086,14 +2100,14 @@ void RoutingManager::LocalOnLinkPrefix::Deprecate(void) { case kPublishing: mState = kIdle; - Get().EvaluatePublishingPrefix(mPrefix); + Get().EvaluatePublishingPrefix(mLocalPrefix); mState = kIdle; break; case kAdvertising: mState = kDeprecating; mTimer.FireAtIfEarlier(mExpireTime); - LogInfo("Deprecate local on-link prefix %s", mPrefix.ToString().AsCString()); + LogInfo("Deprecate local on-link prefix %s", mLocalPrefix.ToString().AsCString()); break; case kIdle: @@ -2105,11 +2119,11 @@ exit: return; } -bool RoutingManager::LocalOnLinkPrefix::ShouldPublish(NetworkData::ExternalRouteConfig &aRouteConfig) const +bool RoutingManager::OnLinkPrefixManager::ShouldPublish(NetworkData::ExternalRouteConfig &aRouteConfig) const { bool shouldPublish = false; - if (aRouteConfig.GetPrefix() == mPrefix) + if (aRouteConfig.GetPrefix() == mLocalPrefix) { switch (mState) { @@ -2123,7 +2137,7 @@ bool RoutingManager::LocalOnLinkPrefix::ShouldPublish(NetworkData::ExternalRoute break; } } - else if ((mOldPrefix.GetLength() != 0) && (aRouteConfig.GetPrefix() == mOldPrefix)) + else if ((mOldLocalPrefix.GetLength() != 0) && (aRouteConfig.GetPrefix() == mOldLocalPrefix)) { shouldPublish = true; aRouteConfig.mPreference = NetworkData::kRoutePreferenceMedium; @@ -2132,26 +2146,26 @@ bool RoutingManager::LocalOnLinkPrefix::ShouldPublish(NetworkData::ExternalRoute return shouldPublish; } -void RoutingManager::LocalOnLinkPrefix::EnterAdvertisingState(void) +void RoutingManager::OnLinkPrefixManager::EnterAdvertisingState(void) { mState = kAdvertising; mExpireTime = TimerMilli::GetNow() + TimeMilli::SecToMsec(kDefaultOnLinkPrefixLifetime); - LogInfo("Start advertising local on-link prefix %s", mPrefix.ToString().AsCString()); + LogInfo("Start advertising local on-link prefix %s", mLocalPrefix.ToString().AsCString()); } -bool RoutingManager::LocalOnLinkPrefix::IsPublishingOrAdvertising(void) const +bool RoutingManager::OnLinkPrefixManager::IsPublishingOrAdvertising(void) const { return (mState == kPublishing) || (mState == kAdvertising); } -void RoutingManager::LocalOnLinkPrefix::AppendAsPiosTo(Ip6::Nd::RouterAdvertMessage &aRaMessage) +void RoutingManager::OnLinkPrefixManager::AppendAsPiosTo(Ip6::Nd::RouterAdvertMessage &aRaMessage) { AppendCurPrefix(aRaMessage); AppendOldPrefix(aRaMessage); } -void RoutingManager::LocalOnLinkPrefix::AppendCurPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage) +void RoutingManager::OnLinkPrefixManager::AppendCurPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage) { // Append the local on-link prefix to the `aRaMessage` as a PIO // only if it is being advertised or deprecated. @@ -2181,36 +2195,37 @@ void RoutingManager::LocalOnLinkPrefix::AppendCurPrefix(Ip6::Nd::RouterAdvertMes ExitNow(); } - SuccessOrAssert(aRaMessage.AppendPrefixInfoOption(mPrefix, validLifetime, preferredLifetime)); + SuccessOrAssert(aRaMessage.AppendPrefixInfoOption(mLocalPrefix, validLifetime, preferredLifetime)); - LogInfo("RouterAdvert: Added PIO for %s (valid=%u, preferred=%u)", mPrefix.ToString().AsCString(), validLifetime, - preferredLifetime); + LogInfo("RouterAdvert: Added PIO for %s (valid=%u, preferred=%u)", mLocalPrefix.ToString().AsCString(), + validLifetime, preferredLifetime); exit: return; } -void RoutingManager::LocalOnLinkPrefix::AppendOldPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage) +void RoutingManager::OnLinkPrefixManager::AppendOldPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage) { TimeMilli now = TimerMilli::GetNow(); uint32_t validLifetime; - VerifyOrExit((mOldPrefix.GetLength() != 0) && (mOldExpireTime > now)); + VerifyOrExit((mOldLocalPrefix.GetLength() != 0) && (mOldExpireTime > now)); validLifetime = TimeMilli::MsecToSec(mOldExpireTime - now); - SuccessOrAssert(aRaMessage.AppendPrefixInfoOption(mOldPrefix, validLifetime, 0)); + SuccessOrAssert(aRaMessage.AppendPrefixInfoOption(mOldLocalPrefix, validLifetime, 0)); - LogInfo("RouterAdvert: Added PIO for %s (valid=%u, preferred=0)", mOldPrefix.ToString().AsCString(), validLifetime); + LogInfo("RouterAdvert: Added PIO for %s (valid=%u, preferred=0)", mOldLocalPrefix.ToString().AsCString(), + validLifetime); exit: return; } -void RoutingManager::LocalOnLinkPrefix::HandleNetDataChange(void) +void RoutingManager::OnLinkPrefixManager::HandleNetDataChange(void) { VerifyOrExit(mState == kPublishing); - if (Get().NetworkDataContainsExternalRoute(mPrefix)) + if (Get().NetworkDataContainsExternalRoute(mLocalPrefix)) { EnterAdvertisingState(); Get().ScheduleRoutingPolicyEvaluation(kAfterRandomDelay); @@ -2220,10 +2235,10 @@ exit: return; } -void RoutingManager::LocalOnLinkPrefix::HandleExtPanIdChange(void) +void RoutingManager::OnLinkPrefixManager::HandleExtPanIdChange(void) { // If the prefix is advertised or being deprecated we remember it - // as `mOldPrefix` and deprecate it. It will be included in + // as `mOldLocalPrefix` and deprecate it. It will be included in // emitted RAs as PIO with zero preferred lifetime. It will still // be present in Network Data until its expire time so to allow // Thread nodes to continue to communicate with `InfraIf` devices @@ -2235,46 +2250,46 @@ void RoutingManager::LocalOnLinkPrefix::HandleExtPanIdChange(void) break; case kPublishing: - Get().UnpublishExternalRoute(mPrefix); + Get().UnpublishExternalRoute(mLocalPrefix); break; case kAdvertising: case kDeprecating: - if (mOldPrefix.GetLength() != 0) + if (mOldLocalPrefix.GetLength() != 0) { - Ip6::Prefix prevPrefix = mOldPrefix; + Ip6::Prefix prevPrefix = mOldLocalPrefix; - mOldPrefix.Clear(); + mOldLocalPrefix.Clear(); Get().EvaluatePublishingPrefix(prevPrefix); } - mOldPrefix = mPrefix; - mOldExpireTime = mExpireTime; + mOldLocalPrefix = mLocalPrefix; + mOldExpireTime = mExpireTime; mTimer.FireAtIfEarlier(mOldExpireTime); break; } mState = kIdle; - Generate(); + GenerateLocalPrefix(); } -void RoutingManager::LocalOnLinkPrefix::HandleTimer(void) +void RoutingManager::OnLinkPrefixManager::HandleTimer(void) { TimeMilli now = TimerMilli::GetNow(); if ((mState == kDeprecating) && (now >= mExpireTime)) { - LogInfo("Local on-link prefix %s expired", mPrefix.ToString().AsCString()); + LogInfo("Local on-link prefix %s expired", mLocalPrefix.ToString().AsCString()); mState = kIdle; - Get().EvaluatePublishingPrefix(mPrefix); + Get().EvaluatePublishingPrefix(mLocalPrefix); } - if ((mOldPrefix.GetLength() != 0) && (now >= mOldExpireTime)) + if ((mOldLocalPrefix.GetLength() != 0) && (now >= mOldExpireTime)) { - Ip6::Prefix oldPrefix = mOldPrefix; + Ip6::Prefix oldPrefix = mOldLocalPrefix; - LogInfo("Old local on-link prefix %s expired", mOldPrefix.ToString().AsCString()); - mOldPrefix.Clear(); + LogInfo("Old local on-link prefix %s expired", mOldLocalPrefix.ToString().AsCString()); + mOldLocalPrefix.Clear(); Get().EvaluatePublishingPrefix(oldPrefix); } @@ -2285,7 +2300,7 @@ void RoutingManager::LocalOnLinkPrefix::HandleTimer(void) mTimer.FireAt(mExpireTime); } - if (mOldPrefix.GetLength() != 0) + if (mOldLocalPrefix.GetLength() != 0) { mTimer.FireAtIfEarlier(mOldExpireTime); } diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index e6d10d350..85ddcfb8a 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -633,21 +633,22 @@ private: bool mIsAddedInNetData; }; - void HandleLocalOnLinkPrefixTimer(void) { mLocalOnLinkPrefix.HandleTimer(); } + void HandleOnLinkPrefixManagerTimer(void) { mOnLinkPrefixManager.HandleTimer(); } - class LocalOnLinkPrefix : public InstanceLocator + class OnLinkPrefixManager : public InstanceLocator { public: - explicit LocalOnLinkPrefix(Instance &aInstance); + explicit OnLinkPrefixManager(Instance &aInstance); - void Generate(void); + void GenerateLocalPrefix(void); void Start(void); void Stop(void); - void PublishAndAdvertise(void); - void Deprecate(void); + void Evaluate(void); + const Ip6::Prefix &GetLocalPrefix(void) const { return mLocalPrefix; } + bool IsInitalEvaluationDone(void) const; + void HandleDiscoveredPrefixTableChanged(void); bool ShouldPublish(NetworkData::ExternalRouteConfig &aRouteConfig) const; void AppendAsPiosTo(Ip6::Nd::RouterAdvertMessage &aRaMessage); - const Ip6::Prefix &GetPrefix(void) const { return mPrefix; } bool IsPublishingOrAdvertising(void) const; void HandleNetDataChange(void); void HandleExtPanIdChange(void); @@ -662,16 +663,19 @@ private: kDeprecating, }; + void PublishAndAdvertise(void); + void Deprecate(void); void EnterAdvertisingState(void); void AppendCurPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage); void AppendOldPrefix(Ip6::Nd::RouterAdvertMessage &aRaMessage); - using ExpireTimer = TimerMilliIn; + using ExpireTimer = TimerMilliIn; - Ip6::Prefix mPrefix; + Ip6::Prefix mLocalPrefix; + Ip6::Prefix mFavoredDiscoveredPrefix; State mState; TimeMilli mExpireTime; - Ip6::Prefix mOldPrefix; + Ip6::Prefix mOldLocalPrefix; TimeMilli mOldExpireTime; ExpireTimer mTimer; }; @@ -799,7 +803,6 @@ private: bool IsEnabled(void) const { return mIsEnabled; } Error LoadOrGenerateRandomBrUlaPrefix(void); - void EvaluateOnLinkPrefix(void); void EvaluateRoutingPolicy(void); bool IsInitalPolicyEvaluationDone(void) const; void ScheduleRoutingPolicyEvaluation(ScheduleMode aMode); @@ -851,11 +854,7 @@ private: RoutePreference mRouteInfoOptionPreference; - // The currently favored (smallest) discovered on-link prefix. - // Prefix length of zero indicates there is none. - Ip6::Prefix mFavoredDiscoveredOnLinkPrefix; - - LocalOnLinkPrefix mLocalOnLinkPrefix; + OnLinkPrefixManager mOnLinkPrefixManager; DiscoveredPrefixTable mDiscoveredPrefixTable;