diff --git a/src/core/border_router/br_types.cpp b/src/core/border_router/br_types.cpp index 781f85eb0..a229c42be 100644 --- a/src/core/border_router/br_types.cpp +++ b/src/core/border_router/br_types.cpp @@ -255,6 +255,11 @@ void OmrPrefix::SetPrefix(const Ip6::Prefix &aPrefix, RoutePreference aPreferenc mPreference = aPreference; } +bool OmrPrefix::Matches(const Ip6::Prefix &aPrefix, RoutePreference aPreference) const +{ + return (mPreference == aPreference) && (mPrefix == aPrefix); +} + //--------------------------------------------------------------------------------------------------------------------- // FavoredOmrPrefix diff --git a/src/core/border_router/br_types.hpp b/src/core/border_router/br_types.hpp index 10a048102..1676b2a75 100644 --- a/src/core/border_router/br_types.hpp +++ b/src/core/border_router/br_types.hpp @@ -582,6 +582,17 @@ public: */ void SetPrefix(const Ip6::Prefix &aPrefix, RoutePreference aPreference); + /** + * Indicates whether the OMR prefix matches a given prefix and preference. + * + * @param[in] aPrefix The prefix to compare with. + * @param[in] aPreference The preference to compare with. + * + * @retval TRUE The OMR prefix matches the given prefix and preference. + * @retval FALSE The OMR prefix does not match the given prefix and preference. + */ + bool Matches(const Ip6::Prefix &aPrefix, RoutePreference aPreference) const; + protected: Ip6::Prefix mPrefix; RoutePreference mPreference; diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index ac6356849..602dd18dc 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -857,8 +857,13 @@ void RoutingManager::OmrPrefixManager::DetermineFavoredPrefixInNetData(FavoredOm void RoutingManager::OmrPrefixManager::UpdateLocalPrefix(void) { - // Determine the local prefix and remove any outdated previous - // local prefix which may have been added in the Network Data. + // Determine the local prefix, its origin and remove any outdated + // previous local prefix which may have been added in the Network + // Data. + + const Ip6::Prefix *prefix = nullptr; + RoutePreference preference; + PrefixOrigin origin; switch (mConfig) { @@ -866,45 +871,46 @@ void RoutingManager::OmrPrefixManager::UpdateLocalPrefix(void) #if OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_ENABLE if (Get().mPdPrefixManager.HasPrefix() && !Get().mPdPrefixManager.HasConflict()) { - if (mLocalPrefix.GetPrefix() != Get().mPdPrefixManager.GetPrefix()) - { - RemoveLocalFromNetData(); - mLocalPrefix.SetPrefix(Get().mPdPrefixManager.GetPrefix(), - PdPrefixManager::kPdRoutePreference); - LogInfo("Setting local OMR prefix to PD prefix: %s", mLocalPrefix.GetPrefix().ToString().AsCString()); - } + prefix = &Get().mPdPrefixManager.GetPrefix(); + preference = PdPrefixManager::kPdRoutePreference; + origin = kDhcp6Pd; + break; } - else #endif - - if (mLocalPrefix.GetPrefix() != mGeneratedPrefix) - { - RemoveLocalFromNetData(); - mLocalPrefix.SetPrefix(mGeneratedPrefix, RoutePreference::kRoutePreferenceLow); - LogInfo("Setting local OMR prefix to generated prefix: %s", - mLocalPrefix.GetPrefix().ToString().AsCString()); - } - + prefix = &mGeneratedPrefix; + preference = RoutePreference::kRoutePreferenceLow; + origin = kSelfGenerated; break; case kOmrConfigCustom: - if (mLocalPrefix != mCustomPrefix) - { - RemoveLocalFromNetData(); - mLocalPrefix = mCustomPrefix; - LogInfo("Setting local OMR prefix to custom prefix: %s", mLocalPrefix.GetPrefix().ToString().AsCString()); - } - + prefix = &mCustomPrefix.GetPrefix(); + preference = mCustomPrefix.GetPreference(); + origin = kCustom; break; case kOmrConfigDisabled: - if (!mLocalPrefix.IsEmpty()) - { - RemoveLocalFromNetData(); - mLocalPrefix.Clear(); - } break; } + + if (prefix == nullptr) + { + VerifyOrExit(!mLocalPrefix.IsEmpty()); + RemoveLocalFromNetData(); + mLocalPrefix.Clear(); + LogInfo("Cleared local OMR prefix"); + ExitNow(); + } + + VerifyOrExit(!mLocalPrefix.Matches(*prefix, preference) || (origin != mLocalPrefixOrigin)); + + RemoveLocalFromNetData(); + mLocalPrefix.SetPrefix(*prefix, preference); + mLocalPrefixOrigin = origin; + + LogInfo("Set %s", LocalToString().AsCString()); + +exit: + return; } void RoutingManager::OmrPrefixManager::Evaluate(void) @@ -1040,8 +1046,11 @@ RoutingManager::OmrPrefixManager::InfoString RoutingManager::OmrPrefixManager::L { InfoString string; - string.Append("local OMR prefix %s (def-route:%s)", mLocalPrefix.GetPrefix().ToString().AsCString(), - ToYesNo(mDefaultRoute)); + string.Append("local OMR prefix %s (prf:%s, def-route:%s, origin:%s)", + mLocalPrefix.GetPrefix().ToString().AsCString(), + RoutePreferenceToString(mLocalPrefix.GetPreference()), ToYesNo(mDefaultRoute), + PrefixOriginToString(mLocalPrefixOrigin)); + return string; } @@ -1087,6 +1096,18 @@ const char *RoutingManager::OmrPrefixManager::OmrConfigToString(OmrConfig aConfi return kStrings[aConfig]; } +const char *RoutingManager::OmrPrefixManager::PrefixOriginToString(PrefixOrigin aOrigin) +{ +#define PrefixOriginMapList(_) \ + _(kSelfGenerated, "self-gen") \ + _(kCustom, "custom") \ + _(kDhcp6Pd, "dhcp6-pd") + + DefineEnumStringArray(PrefixOriginMapList); + + return kStrings[aOrigin]; +} + //--------------------------------------------------------------------------------------------------------------------- // OnLinkPrefixManager diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index b802f244a..7fe77618f 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -640,6 +640,13 @@ private: typedef String InfoString; + enum PrefixOrigin : uint8_t // of `mLocalPrefix` + { + kSelfGenerated, + kCustom, + kDhcp6Pd, + }; + void SetFavoredPrefix(const OmrPrefix &aOmrPrefix); void ClearFavoredPrefix(void) { SetFavoredPrefix(OmrPrefix()); } void DetermineFavoredPrefixInNetData(FavoredOmrPrefix &aFavoredPrefix); @@ -651,12 +658,14 @@ private: InfoString FavoredToString(const FavoredOmrPrefix &aFavoredPrefix) const; static const char *OmrConfigToString(OmrConfig aConfig); + static const char *PrefixOriginToString(PrefixOrigin aOrigin); OmrConfig mConfig; OmrPrefix mLocalPrefix; OmrPrefix mCustomPrefix; Ip6::Prefix mGeneratedPrefix; FavoredOmrPrefix mFavoredPrefix; + PrefixOrigin mLocalPrefixOrigin; bool mIsLocalAddedInNetData; bool mDefaultRoute; };