mirror of
https://github.com/espressif/openthread.git
synced 2026-08-04 09:57:47 +00:00
[routing-manager] add OmrPrefixManager (#9062)
This commit adds the `OmrPrefixManager` class to the `RoutingManager`. The `OmrPrefixManager` class manages OMR prefixes. In particular, it determines the favored and local OMR prefixes, and decides when/if to add/remove the local OMR prefix to/from Network Data.
This commit is contained in:
@@ -67,7 +67,7 @@ RoutingManager::RoutingManager(Instance &aInstance)
|
||||
, mIsRunning(false)
|
||||
, mIsEnabled(false)
|
||||
, mInfraIf(aInstance)
|
||||
, mLocalOmrPrefix(aInstance)
|
||||
, mOmrPrefixManager(aInstance)
|
||||
, mRioPreference(NetworkData::kRoutePreferenceLow)
|
||||
, mUserSetRioPreference(false)
|
||||
, mOnLinkPrefixManager(aInstance)
|
||||
@@ -90,7 +90,7 @@ Error RoutingManager::Init(uint32_t aInfraIfIndex, bool aInfraIfIsRunning)
|
||||
SuccessOrExit(error = mInfraIf.Init(aInfraIfIndex));
|
||||
|
||||
SuccessOrExit(error = LoadOrGenerateRandomBrUlaPrefix());
|
||||
mLocalOmrPrefix.GenerateFrom(mBrUlaPrefix);
|
||||
mOmrPrefixManager.Init(mBrUlaPrefix);
|
||||
#if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
|
||||
mNat64PrefixManager.GenerateLocalPrefix(mBrUlaPrefix);
|
||||
#endif
|
||||
@@ -180,7 +180,7 @@ Error RoutingManager::GetOmrPrefix(Ip6::Prefix &aPrefix) const
|
||||
Error error = kErrorNone;
|
||||
|
||||
VerifyOrExit(IsInitialized(), error = kErrorInvalidState);
|
||||
aPrefix = mLocalOmrPrefix.GetPrefix();
|
||||
aPrefix = mOmrPrefixManager.GetLocalPrefix().GetPrefix();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
@@ -191,8 +191,8 @@ Error RoutingManager::GetFavoredOmrPrefix(Ip6::Prefix &aPrefix, RoutePreference
|
||||
Error error = kErrorNone;
|
||||
|
||||
VerifyOrExit(IsRunning(), error = kErrorInvalidState);
|
||||
aPrefix = mFavoredOmrPrefix.GetPrefix();
|
||||
aPreference = mFavoredOmrPrefix.GetPreference();
|
||||
aPrefix = mOmrPrefixManager.GetFavoredPrefix().GetPrefix();
|
||||
aPreference = mOmrPrefixManager.GetFavoredPrefix().GetPreference();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
@@ -309,7 +309,7 @@ void RoutingManager::Start(void)
|
||||
mIsRunning = true;
|
||||
UpdateDiscoveredPrefixTableOnNetDataChange();
|
||||
mOnLinkPrefixManager.Start();
|
||||
DetermineFavoredOmrPrefix();
|
||||
mOmrPrefixManager.Start();
|
||||
mRoutePublisher.Start();
|
||||
mRsSender.Start();
|
||||
#if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
|
||||
@@ -322,9 +322,7 @@ void RoutingManager::Stop(void)
|
||||
{
|
||||
VerifyOrExit(mIsRunning);
|
||||
|
||||
mLocalOmrPrefix.RemoveFromNetData();
|
||||
mFavoredOmrPrefix.Clear();
|
||||
|
||||
mOmrPrefixManager.Stop();
|
||||
mOnLinkPrefixManager.Stop();
|
||||
|
||||
#if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
|
||||
@@ -458,63 +456,6 @@ void RoutingManager::UpdateDiscoveredPrefixTableOnNetDataChange(void)
|
||||
}
|
||||
}
|
||||
|
||||
void RoutingManager::DetermineFavoredOmrPrefix(void)
|
||||
{
|
||||
// Determine the favored OMR prefix present in Network Data.
|
||||
|
||||
NetworkData::Iterator iterator = NetworkData::kIteratorInit;
|
||||
NetworkData::OnMeshPrefixConfig onMeshPrefixConfig;
|
||||
|
||||
mFavoredOmrPrefix.Clear();
|
||||
|
||||
while (Get<NetworkData::Leader>().GetNextOnMeshPrefix(iterator, onMeshPrefixConfig) == kErrorNone)
|
||||
{
|
||||
if (!IsValidOmrPrefix(onMeshPrefixConfig) || !onMeshPrefixConfig.mPreferred)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mFavoredOmrPrefix.IsEmpty() || !mFavoredOmrPrefix.IsFavoredOver(onMeshPrefixConfig))
|
||||
{
|
||||
mFavoredOmrPrefix.SetFrom(onMeshPrefixConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RoutingManager::EvaluateOmrPrefix(void)
|
||||
{
|
||||
OT_ASSERT(mIsRunning);
|
||||
|
||||
DetermineFavoredOmrPrefix();
|
||||
|
||||
// Decide if we need to add or remove our local OMR prefix.
|
||||
|
||||
if (mFavoredOmrPrefix.IsEmpty())
|
||||
{
|
||||
LogInfo("EvaluateOmrPrefix: No preferred OMR prefix found in Thread network");
|
||||
|
||||
// The `mFavoredOmrPrefix` remains empty if we fail to publish
|
||||
// the local OMR prefix.
|
||||
SuccessOrExit(mLocalOmrPrefix.AddToNetData());
|
||||
|
||||
mFavoredOmrPrefix.SetFrom(mLocalOmrPrefix);
|
||||
}
|
||||
else if (mFavoredOmrPrefix.GetPrefix() == mLocalOmrPrefix.GetPrefix())
|
||||
{
|
||||
IgnoreError(mLocalOmrPrefix.AddToNetData());
|
||||
}
|
||||
else if (mLocalOmrPrefix.IsAddedInNetData())
|
||||
{
|
||||
LogInfo("EvaluateOmrPrefix: There is already a preferred OMR prefix %s in the Thread network",
|
||||
mFavoredOmrPrefix.GetPrefix().ToString().AsCString());
|
||||
|
||||
mLocalOmrPrefix.RemoveFromNetData();
|
||||
}
|
||||
|
||||
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
|
||||
@@ -526,7 +467,7 @@ void RoutingManager::EvaluateRoutingPolicy(void)
|
||||
LogInfo("Evaluating routing policy");
|
||||
|
||||
mOnLinkPrefixManager.Evaluate();
|
||||
EvaluateOmrPrefix();
|
||||
mOmrPrefixManager.Evaluate();
|
||||
mRoutePublisher.Evaluate();
|
||||
#if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
|
||||
mNat64PrefixManager.Evaluate();
|
||||
@@ -557,7 +498,8 @@ bool RoutingManager::IsInitalPolicyEvaluationDone(void) const
|
||||
// the emitted Router Advert message on infrastructure side
|
||||
// and published in the Thread Network Data.
|
||||
|
||||
return mIsRunning && !mFavoredOmrPrefix.IsEmpty() && mOnLinkPrefixManager.IsInitalEvaluationDone();
|
||||
return mIsRunning && !mOmrPrefixManager.GetFavoredPrefix().IsEmpty() &&
|
||||
mOnLinkPrefixManager.IsInitalEvaluationDone();
|
||||
}
|
||||
|
||||
void RoutingManager::ScheduleRoutingPolicyEvaluation(ScheduleMode aMode)
|
||||
@@ -641,7 +583,8 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
|
||||
|
||||
while (Get<NetworkData::Leader>().GetNextOnMeshPrefix(iterator, prefixConfig) == kErrorNone)
|
||||
{
|
||||
if (!prefixConfig.mOnMesh || prefixConfig.mDp || (prefixConfig.GetPrefix() == mLocalOmrPrefix.GetPrefix()))
|
||||
if (!prefixConfig.mOnMesh || prefixConfig.mDp ||
|
||||
(prefixConfig.GetPrefix() == mOmrPrefixManager.GetLocalPrefix().GetPrefix()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -649,9 +592,9 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
|
||||
mAdvertisedPrefixes.MarkAsDeleted(prefixConfig.GetPrefix());
|
||||
}
|
||||
|
||||
if (mLocalOmrPrefix.IsAddedInNetData())
|
||||
if (mOmrPrefixManager.IsLocalAddedInNetData())
|
||||
{
|
||||
mAdvertisedPrefixes.MarkAsDeleted(mLocalOmrPrefix.GetPrefix());
|
||||
mAdvertisedPrefixes.MarkAsDeleted(mOmrPrefixManager.GetLocalPrefix().GetPrefix());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -679,16 +622,16 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
|
||||
|
||||
// (1) Local OMR prefix.
|
||||
|
||||
if (mLocalOmrPrefix.IsAddedInNetData())
|
||||
if (mOmrPrefixManager.IsLocalAddedInNetData())
|
||||
{
|
||||
mAdvertisedPrefixes.Add(mLocalOmrPrefix.GetPrefix());
|
||||
mAdvertisedPrefixes.Add(mOmrPrefixManager.GetLocalPrefix().GetPrefix());
|
||||
}
|
||||
|
||||
// (2) Favored OMR prefix.
|
||||
|
||||
if (!mFavoredOmrPrefix.IsEmpty() && !mFavoredOmrPrefix.IsDomainPrefix())
|
||||
if (!mOmrPrefixManager.GetFavoredPrefix().IsEmpty() && !mOmrPrefixManager.GetFavoredPrefix().IsDomainPrefix())
|
||||
{
|
||||
mAdvertisedPrefixes.Add(mFavoredOmrPrefix.GetPrefix());
|
||||
mAdvertisedPrefixes.Add(mOmrPrefixManager.GetFavoredPrefix().GetPrefix());
|
||||
}
|
||||
|
||||
// (3) All other OMR prefixes.
|
||||
@@ -698,8 +641,8 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
|
||||
while (Get<NetworkData::Leader>().GetNextOnMeshPrefix(iterator, prefixConfig) == kErrorNone)
|
||||
{
|
||||
// Local OMR prefix is added to the array depending on
|
||||
// `mLocalOmrPrefix.IsAddedInNetData()` at step (1). As
|
||||
// we iterate through the Network Data prefixes, we skip
|
||||
// `mOmrPrefixManager.IsLocalAddedInNetData()` at step (1).
|
||||
// As we iterate through the Network Data prefixes, we skip
|
||||
// over entries matching the local OMR prefix. This
|
||||
// ensures that we stop including it in emitted RA
|
||||
// message as soon as we decide to remove it from Network
|
||||
@@ -713,7 +656,8 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsValidOmrPrefix(prefixConfig) && (prefixConfig.GetPrefix() != mLocalOmrPrefix.GetPrefix()))
|
||||
if (IsValidOmrPrefix(prefixConfig) &&
|
||||
(prefixConfig.GetPrefix() != mOmrPrefixManager.GetLocalPrefix().GetPrefix()))
|
||||
{
|
||||
mAdvertisedPrefixes.Add(prefixConfig.GetPrefix());
|
||||
}
|
||||
@@ -993,7 +937,7 @@ bool RoutingManager::ShouldProcessRouteInfoOption(const Ip6::Nd::RouteInfoOption
|
||||
ExitNow();
|
||||
}
|
||||
|
||||
VerifyOrExit(mLocalOmrPrefix.GetPrefix() != aPrefix);
|
||||
VerifyOrExit(mOmrPrefixManager.GetLocalPrefix().GetPrefix() != aPrefix);
|
||||
|
||||
// Ignore OMR prefixes advertised by ourselves or in current Thread Network Data.
|
||||
// The `mAdvertisedPrefixes` and the OMR prefix set in Network Data should eventually
|
||||
@@ -1897,9 +1841,9 @@ uint32_t RoutingManager::DiscoveredPrefixTable::Entry::CalculateExpireDelay(uint
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
// OmrPrefix
|
||||
// FavoredOmrPrefix
|
||||
|
||||
bool RoutingManager::OmrPrefix::IsInfrastructureDerived(void) const
|
||||
bool RoutingManager::FavoredOmrPrefix::IsInfrastructureDerived(void) const
|
||||
{
|
||||
// Indicate whether the OMR prefix is infrastructure-derived which
|
||||
// can be identified as a valid OMR prefix with preference of
|
||||
@@ -1908,21 +1852,21 @@ bool RoutingManager::OmrPrefix::IsInfrastructureDerived(void) const
|
||||
return !IsEmpty() && (mPreference >= NetworkData::kRoutePreferenceMedium);
|
||||
}
|
||||
|
||||
void RoutingManager::OmrPrefix::SetFrom(const NetworkData::OnMeshPrefixConfig &aOnMeshPrefixConfig)
|
||||
void RoutingManager::FavoredOmrPrefix::SetFrom(const NetworkData::OnMeshPrefixConfig &aOnMeshPrefixConfig)
|
||||
{
|
||||
mPrefix = aOnMeshPrefixConfig.GetPrefix();
|
||||
mPreference = aOnMeshPrefixConfig.GetPreference();
|
||||
mIsDomainPrefix = aOnMeshPrefixConfig.mDp;
|
||||
}
|
||||
|
||||
void RoutingManager::OmrPrefix::SetFrom(const LocalOmrPrefix &aLocalOmrPrefix)
|
||||
void RoutingManager::FavoredOmrPrefix::SetFrom(const OmrPrefix &aOmrPrefix)
|
||||
{
|
||||
mPrefix = aLocalOmrPrefix.GetPrefix();
|
||||
mPreference = aLocalOmrPrefix.GetPreference();
|
||||
mIsDomainPrefix = false;
|
||||
mPrefix = aOmrPrefix.GetPrefix();
|
||||
mPreference = aOmrPrefix.GetPreference();
|
||||
mIsDomainPrefix = aOmrPrefix.IsDomainPrefix();
|
||||
}
|
||||
|
||||
bool RoutingManager::OmrPrefix::IsFavoredOver(const NetworkData::OnMeshPrefixConfig &aOmrPrefixConfig) const
|
||||
bool RoutingManager::FavoredOmrPrefix::IsFavoredOver(const NetworkData::OnMeshPrefixConfig &aOmrPrefixConfig) const
|
||||
{
|
||||
// This method determines whether this OMR prefix is favored
|
||||
// over another prefix. A prefix with higher preference is
|
||||
@@ -1942,37 +1886,104 @@ bool RoutingManager::OmrPrefix::IsFavoredOver(const NetworkData::OnMeshPrefixCon
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
// LocalOmrPrefix
|
||||
// OmrPrefixManager
|
||||
|
||||
RoutingManager::LocalOmrPrefix::LocalOmrPrefix(Instance &aInstance)
|
||||
RoutingManager::OmrPrefixManager::OmrPrefixManager(Instance &aInstance)
|
||||
: InstanceLocator(aInstance)
|
||||
, mIsAddedInNetData(false)
|
||||
, mIsLocalAddedInNetData(false)
|
||||
, mDefaultRoute(false)
|
||||
{
|
||||
}
|
||||
|
||||
void RoutingManager::LocalOmrPrefix::GenerateFrom(const Ip6::Prefix &aBrUlaPrefix)
|
||||
void RoutingManager::OmrPrefixManager::Init(const Ip6::Prefix &aBrUlaPrefix)
|
||||
{
|
||||
mPrefix = aBrUlaPrefix;
|
||||
mPrefix.SetSubnetId(kOmrPrefixSubnetId);
|
||||
mPrefix.SetLength(kOmrPrefixLength);
|
||||
mLocalPrefix.mPrefix = aBrUlaPrefix;
|
||||
mLocalPrefix.mPrefix.SetSubnetId(kOmrPrefixSubnetId);
|
||||
mLocalPrefix.mPrefix.SetLength(kOmrPrefixLength);
|
||||
mLocalPrefix.mPreference = NetworkData::kRoutePreferenceLow;
|
||||
mLocalPrefix.mIsDomainPrefix = false;
|
||||
|
||||
LogInfo("Generated OMR prefix: %s", mPrefix.ToString().AsCString());
|
||||
LogInfo("Generated local OMR prefix: %s", mLocalPrefix.mPrefix.ToString().AsCString());
|
||||
}
|
||||
|
||||
Error RoutingManager::LocalOmrPrefix::AddToNetData(void)
|
||||
void RoutingManager::OmrPrefixManager::Start(void) { DetermineFavoredPrefix(); }
|
||||
|
||||
void RoutingManager::OmrPrefixManager::Stop(void)
|
||||
{
|
||||
RemoveLocalFromNetData();
|
||||
mFavoredPrefix.Clear();
|
||||
}
|
||||
|
||||
void RoutingManager::OmrPrefixManager::DetermineFavoredPrefix(void)
|
||||
{
|
||||
// Determine the favored OMR prefix present in Network Data.
|
||||
|
||||
NetworkData::Iterator iterator = NetworkData::kIteratorInit;
|
||||
NetworkData::OnMeshPrefixConfig prefixConfig;
|
||||
|
||||
mFavoredPrefix.Clear();
|
||||
|
||||
while (Get<NetworkData::Leader>().GetNextOnMeshPrefix(iterator, prefixConfig) == kErrorNone)
|
||||
{
|
||||
if (!IsValidOmrPrefix(prefixConfig) || !prefixConfig.mPreferred)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mFavoredPrefix.IsEmpty() || !mFavoredPrefix.IsFavoredOver(prefixConfig))
|
||||
{
|
||||
mFavoredPrefix.SetFrom(prefixConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RoutingManager::OmrPrefixManager::Evaluate(void)
|
||||
{
|
||||
OT_ASSERT(Get<RoutingManager>().IsRunning());
|
||||
|
||||
DetermineFavoredPrefix();
|
||||
|
||||
// Decide if we need to add or remove our local OMR prefix.
|
||||
|
||||
if (mFavoredPrefix.IsEmpty())
|
||||
{
|
||||
LogInfo("No favored OMR prefix found in Thread network");
|
||||
|
||||
// The `mFavoredPrefix` remains empty if we fail to publish
|
||||
// the local OMR prefix.
|
||||
SuccessOrExit(AddLocalToNetData());
|
||||
|
||||
mFavoredPrefix.SetFrom(mLocalPrefix);
|
||||
}
|
||||
else if (mFavoredPrefix.GetPrefix() == mLocalPrefix.GetPrefix())
|
||||
{
|
||||
IgnoreError(AddLocalToNetData());
|
||||
}
|
||||
else if (mIsLocalAddedInNetData)
|
||||
{
|
||||
LogInfo("There is already a favored OMR prefix %s in the Thread network",
|
||||
mFavoredPrefix.GetPrefix().ToString().AsCString());
|
||||
|
||||
RemoveLocalFromNetData();
|
||||
}
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
Error RoutingManager::OmrPrefixManager::AddLocalToNetData(void)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
|
||||
VerifyOrExit(!mIsAddedInNetData);
|
||||
SuccessOrExit(error = AddOrUpdate());
|
||||
mIsAddedInNetData = true;
|
||||
VerifyOrExit(!mIsLocalAddedInNetData);
|
||||
SuccessOrExit(error = AddOrUpdateLocalInNetData());
|
||||
mIsLocalAddedInNetData = true;
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error RoutingManager::LocalOmrPrefix::AddOrUpdate(void)
|
||||
Error RoutingManager::OmrPrefixManager::AddOrUpdateLocalInNetData(void)
|
||||
{
|
||||
// Add the local OMR prefix in Thread Network Data or update it
|
||||
// (e.g., change default route flag) if it is already added.
|
||||
@@ -1981,71 +1992,72 @@ Error RoutingManager::LocalOmrPrefix::AddOrUpdate(void)
|
||||
NetworkData::OnMeshPrefixConfig config;
|
||||
|
||||
config.Clear();
|
||||
config.mPrefix = mPrefix;
|
||||
config.mPrefix = mLocalPrefix.GetPrefix();
|
||||
config.mStable = true;
|
||||
config.mSlaac = true;
|
||||
config.mPreferred = true;
|
||||
config.mOnMesh = true;
|
||||
config.mDefaultRoute = mDefaultRoute;
|
||||
config.mPreference = GetPreference();
|
||||
config.mPreference = mLocalPrefix.GetPreference();
|
||||
|
||||
error = Get<NetworkData::Local>().AddOnMeshPrefix(config);
|
||||
|
||||
if (error != kErrorNone)
|
||||
{
|
||||
LogWarn("Failed to %s %s in Thread Network Data: %s", !mIsAddedInNetData ? "add" : "update",
|
||||
ToString().AsCString(), ErrorToString(error));
|
||||
LogWarn("Failed to %s %s in Thread Network Data: %s", !mIsLocalAddedInNetData ? "add" : "update",
|
||||
LocalToString().AsCString(), ErrorToString(error));
|
||||
ExitNow();
|
||||
}
|
||||
|
||||
Get<NetworkData::Notifier>().HandleServerDataUpdated();
|
||||
|
||||
LogInfo("%s %s in Thread Network Data", !mIsAddedInNetData ? "Added" : "Updated", ToString().AsCString());
|
||||
LogInfo("%s %s in Thread Network Data", !mIsLocalAddedInNetData ? "Added" : "Updated", LocalToString().AsCString());
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void RoutingManager::LocalOmrPrefix::RemoveFromNetData(void)
|
||||
void RoutingManager::OmrPrefixManager::RemoveLocalFromNetData(void)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
|
||||
VerifyOrExit(mIsAddedInNetData);
|
||||
VerifyOrExit(mIsLocalAddedInNetData);
|
||||
|
||||
error = Get<NetworkData::Local>().RemoveOnMeshPrefix(mPrefix);
|
||||
error = Get<NetworkData::Local>().RemoveOnMeshPrefix(mLocalPrefix.GetPrefix());
|
||||
|
||||
if (error != kErrorNone)
|
||||
{
|
||||
LogWarn("Failed to remove %s from Thread Network Data: %s", ToString().AsCString(), ErrorToString(error));
|
||||
LogWarn("Failed to remove %s from Thread Network Data: %s", LocalToString().AsCString(), ErrorToString(error));
|
||||
ExitNow();
|
||||
}
|
||||
|
||||
mIsAddedInNetData = false;
|
||||
mIsLocalAddedInNetData = false;
|
||||
Get<NetworkData::Notifier>().HandleServerDataUpdated();
|
||||
LogInfo("Removed %s from Thread Network Data", ToString().AsCString());
|
||||
LogInfo("Removed %s from Thread Network Data", LocalToString().AsCString());
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void RoutingManager::LocalOmrPrefix::UpdateDefaultRouteFlag(bool aDefaultRoute)
|
||||
void RoutingManager::OmrPrefixManager::UpdateDefaultRouteFlag(bool aDefaultRoute)
|
||||
{
|
||||
VerifyOrExit(aDefaultRoute != mDefaultRoute);
|
||||
|
||||
mDefaultRoute = aDefaultRoute;
|
||||
|
||||
VerifyOrExit(mIsAddedInNetData);
|
||||
IgnoreError(AddOrUpdate());
|
||||
VerifyOrExit(mIsLocalAddedInNetData);
|
||||
IgnoreError(AddOrUpdateLocalInNetData());
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
RoutingManager::LocalOmrPrefix::InfoString RoutingManager::LocalOmrPrefix::ToString(void) const
|
||||
RoutingManager::OmrPrefixManager::InfoString RoutingManager::OmrPrefixManager::LocalToString(void) const
|
||||
{
|
||||
InfoString string;
|
||||
|
||||
string.Append("local OMR prefix %s (def-route:%s)", mPrefix.ToString().AsCString(), ToYesNo(mDefaultRoute));
|
||||
string.Append("local OMR prefix %s (def-route:%s)", mLocalPrefix.GetPrefix().ToString().AsCString(),
|
||||
ToYesNo(mDefaultRoute));
|
||||
return string;
|
||||
}
|
||||
|
||||
@@ -2632,7 +2644,7 @@ void RoutingManager::RoutePublisher::Evaluate(void)
|
||||
|
||||
VerifyOrExit(Get<RoutingManager>().IsRunning());
|
||||
|
||||
if (Get<RoutingManager>().mFavoredOmrPrefix.IsInfrastructureDerived() &&
|
||||
if (Get<RoutingManager>().mOmrPrefixManager.GetFavoredPrefix().IsInfrastructureDerived() &&
|
||||
Get<RoutingManager>().mDiscoveredPrefixTable.ContainsDefaultOrNonUlaRoutePrefix())
|
||||
{
|
||||
newState = kPublishDefault;
|
||||
@@ -2652,7 +2664,7 @@ exit:
|
||||
{
|
||||
LogInfo("RoutePublisher state: %s -> %s", StateToString(mState), StateToString(newState));
|
||||
UpdatePublishedRoute(newState);
|
||||
Get<RoutingManager>().mLocalOmrPrefix.UpdateDefaultRouteFlag(newState == kPublishDefault);
|
||||
Get<RoutingManager>().mOmrPrefixManager.UpdateDefaultRouteFlag(newState == kPublishDefault);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2873,7 +2885,8 @@ const Ip6::Prefix &RoutingManager::Nat64PrefixManager::GetFavoredPrefix(RoutePre
|
||||
|
||||
aPreference = NetworkData::kRoutePreferenceLow;
|
||||
|
||||
if (mInfraIfPrefix.IsValidNat64() && Get<RoutingManager>().mFavoredOmrPrefix.IsInfrastructureDerived())
|
||||
if (mInfraIfPrefix.IsValidNat64() &&
|
||||
Get<RoutingManager>().mOmrPrefixManager.GetFavoredPrefix().IsInfrastructureDerived())
|
||||
{
|
||||
favoredPrefix = &mInfraIfPrefix;
|
||||
aPreference = NetworkData::kRoutePreferenceMedium;
|
||||
|
||||
@@ -684,51 +684,68 @@ private:
|
||||
SignalTask mSignalTask;
|
||||
};
|
||||
|
||||
class LocalOmrPrefix;
|
||||
class OmrPrefixManager;
|
||||
|
||||
class OmrPrefix : public Clearable<OmrPrefix>
|
||||
{
|
||||
friend class OmrPrefixManager;
|
||||
|
||||
public:
|
||||
OmrPrefix(void) { Clear(); }
|
||||
|
||||
bool IsEmpty(void) const { return (mPrefix.GetLength() == 0); }
|
||||
bool IsInfrastructureDerived(void) const;
|
||||
void SetFrom(const NetworkData::OnMeshPrefixConfig &aOnMeshPrefixConfig);
|
||||
void SetFrom(const LocalOmrPrefix &aLocalOmrPrefix);
|
||||
const Ip6::Prefix &GetPrefix(void) const { return mPrefix; }
|
||||
RoutePreference GetPreference(void) const { return mPreference; }
|
||||
bool IsFavoredOver(const NetworkData::OnMeshPrefixConfig &aOmrPrefixConfig) const;
|
||||
bool IsDomainPrefix(void) const { return mIsDomainPrefix; }
|
||||
|
||||
private:
|
||||
protected:
|
||||
Ip6::Prefix mPrefix;
|
||||
RoutePreference mPreference;
|
||||
bool mIsDomainPrefix;
|
||||
};
|
||||
|
||||
class LocalOmrPrefix : public InstanceLocator
|
||||
class FavoredOmrPrefix : public OmrPrefix
|
||||
{
|
||||
friend class OmrPrefixManager;
|
||||
|
||||
public:
|
||||
bool IsInfrastructureDerived(void) const;
|
||||
|
||||
private:
|
||||
void SetFrom(const NetworkData::OnMeshPrefixConfig &aOnMeshPrefixConfig);
|
||||
void SetFrom(const OmrPrefix &aOmrPrefix);
|
||||
bool IsFavoredOver(const NetworkData::OnMeshPrefixConfig &aOmrPrefixConfig) const;
|
||||
};
|
||||
|
||||
class OmrPrefixManager : public InstanceLocator
|
||||
{
|
||||
public:
|
||||
explicit LocalOmrPrefix(Instance &aInstance);
|
||||
void GenerateFrom(const Ip6::Prefix &aBrUlaPrefix);
|
||||
const Ip6::Prefix &GetPrefix(void) const { return mPrefix; }
|
||||
RoutePreference GetPreference(void) const { return NetworkData::kRoutePreferenceLow; }
|
||||
Error AddToNetData(void);
|
||||
void RemoveFromNetData(void);
|
||||
bool IsAddedInNetData(void) const { return mIsAddedInNetData; }
|
||||
void UpdateDefaultRouteFlag(bool aDefaultRoute);
|
||||
explicit OmrPrefixManager(Instance &aInstance);
|
||||
|
||||
void Init(const Ip6::Prefix &aBrUlaPrefix);
|
||||
void Start(void);
|
||||
void Stop(void);
|
||||
void Evaluate(void);
|
||||
void UpdateDefaultRouteFlag(bool aDefaultRoute);
|
||||
bool IsLocalAddedInNetData(void) const { return mIsLocalAddedInNetData; }
|
||||
const OmrPrefix &GetLocalPrefix(void) const { return mLocalPrefix; }
|
||||
const FavoredOmrPrefix &GetFavoredPrefix(void) const { return mFavoredPrefix; }
|
||||
|
||||
private:
|
||||
static constexpr uint16_t kInfoStringSize = 85;
|
||||
|
||||
typedef String<kInfoStringSize> InfoString;
|
||||
|
||||
Error AddOrUpdate(void);
|
||||
InfoString ToString(void) const;
|
||||
void DetermineFavoredPrefix(void);
|
||||
Error AddLocalToNetData(void);
|
||||
Error AddOrUpdateLocalInNetData(void);
|
||||
void RemoveLocalFromNetData(void);
|
||||
InfoString LocalToString(void) const;
|
||||
|
||||
Ip6::Prefix mPrefix;
|
||||
bool mIsAddedInNetData;
|
||||
bool mDefaultRoute;
|
||||
OmrPrefix mLocalPrefix;
|
||||
FavoredOmrPrefix mFavoredPrefix;
|
||||
bool mIsLocalAddedInNetData;
|
||||
bool mDefaultRoute;
|
||||
};
|
||||
|
||||
void HandleOnLinkPrefixManagerTimer(void) { mOnLinkPrefixManager.HandleTimer(); }
|
||||
@@ -961,8 +978,6 @@ private:
|
||||
void EvaluateRoutingPolicy(void);
|
||||
bool IsInitalPolicyEvaluationDone(void) const;
|
||||
void ScheduleRoutingPolicyEvaluation(ScheduleMode aMode);
|
||||
void DetermineFavoredOmrPrefix(void);
|
||||
void EvaluateOmrPrefix(void);
|
||||
void HandleRsSenderFinished(TimeMilli aStartTime);
|
||||
void SendRouterAdvertisement(RouterAdvTxMode aRaTxMode);
|
||||
|
||||
@@ -1000,8 +1015,7 @@ private:
|
||||
// randomly generated if none is found in persistent storage.
|
||||
Ip6::Prefix mBrUlaPrefix;
|
||||
|
||||
LocalOmrPrefix mLocalOmrPrefix;
|
||||
OmrPrefix mFavoredOmrPrefix;
|
||||
OmrPrefixManager mOmrPrefixManager;
|
||||
|
||||
// List of on-mesh prefixes (discovered from Network Data) which
|
||||
// were advertised as RIO in the last sent RA message.
|
||||
|
||||
Reference in New Issue
Block a user