diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index c0750c774..7e96f85d4 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -825,7 +825,7 @@ bool RoutingManager::ShouldProcessRouteInfoOption(const RouteInfoOption &aRio, c // both checks are necessary. VerifyOrExit(!mRioAdvertiser.HasAdvertised(aPrefix)); - VerifyOrExit(!Get().NetworkDataContainsOmrPrefix(aPrefix)); + VerifyOrExit(!Get().ContainsOmrPrefix(aPrefix)); shouldProcess = true; @@ -848,24 +848,6 @@ exit: return; } -bool RoutingManager::NetworkDataContainsOmrPrefix(const Ip6::Prefix &aPrefix) const -{ - NetworkData::Iterator iterator = NetworkData::kIteratorInit; - NetworkData::OnMeshPrefixConfig onMeshPrefixConfig; - bool contains = false; - - while (Get().GetNextOnMeshPrefix(iterator, onMeshPrefixConfig) == kErrorNone) - { - if (IsValidOmrPrefix(onMeshPrefixConfig) && onMeshPrefixConfig.GetPrefix() == aPrefix) - { - contains = true; - break; - } - } - - return contains; -} - bool RoutingManager::NetworkDataContainsUlaRoute(void) const { // Determine whether leader Network Data contains a route @@ -2127,28 +2109,7 @@ bool RoutingManager::OmrPrefixManager::ShouldAdvertiseLocalAsRio(void) const // may still be present in Network Data for a short interval due // to delays in registering changes with the leader. - bool shouldAdvertise = false; - NetworkData::Iterator iterator = NetworkData::kIteratorInit; - NetworkData::OnMeshPrefixConfig prefixConfig; - - VerifyOrExit(mIsLocalAddedInNetData); - - while (Get().GetNextOnMeshPrefix(iterator, prefixConfig) == kErrorNone) - { - if (!IsValidOmrPrefix(prefixConfig)) - { - continue; - } - - if (prefixConfig.GetPrefix() == mLocalPrefix.GetPrefix()) - { - shouldAdvertise = true; - break; - } - } - -exit: - return shouldAdvertise; + return mIsLocalAddedInNetData && Get().ContainsOmrPrefix(mLocalPrefix.GetPrefix()); } Error RoutingManager::OmrPrefixManager::AddLocalToNetData(void) diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index a814b5452..3c7d2f3ca 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -1399,7 +1399,6 @@ private: bool ShouldProcessPrefixInfoOption(const PrefixInfoOption &aPio, const Ip6::Prefix &aPrefix); bool ShouldProcessRouteInfoOption(const RouteInfoOption &aRio, const Ip6::Prefix &aPrefix); void UpdateDiscoveredPrefixTableOnNetDataChange(void); - bool NetworkDataContainsOmrPrefix(const Ip6::Prefix &aPrefix) const; bool NetworkDataContainsUlaRoute(void) const; void UpdateRouterAdvertHeader(const RouterAdvert::RxMessage *aRaMsg, RouterAdvOrigin aRaOrigin); void ResetDiscoveredPrefixStaleTimer(void); diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 0c08a6175..187e431c2 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -607,5 +607,40 @@ void Leader::SignalNetDataChanged(void) Get().Signal(kEventThreadNetdataChanged); } +#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE + +bool Leader::ContainsOmrPrefix(const Ip6::Prefix &aPrefix) const +{ + bool contains = false; + const PrefixTlv *prefixTlv; + const BorderRouterTlv *brSubTlv; + + VerifyOrExit(BorderRouter::RoutingManager::IsValidOmrPrefix(aPrefix)); + + prefixTlv = FindPrefix(aPrefix); + VerifyOrExit(prefixTlv != nullptr); + + brSubTlv = prefixTlv->FindSubTlv(/* aStable */ true); + + VerifyOrExit(brSubTlv != nullptr); + + for (const BorderRouterEntry *entry = brSubTlv->GetFirstEntry(); entry <= brSubTlv->GetLastEntry(); entry++) + { + OnMeshPrefixConfig config; + + config.SetFrom(*prefixTlv, *brSubTlv, *entry); + + if (BorderRouter::RoutingManager::IsValidOmrPrefix(config)) + { + ExitNow(contains = true); + } + } + +exit: + return contains; +} + +#endif // OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE + } // namespace NetworkData } // namespace ot diff --git a/src/core/thread/network_data_leader.hpp b/src/core/thread/network_data_leader.hpp index 597689199..72610fc62 100644 --- a/src/core/thread/network_data_leader.hpp +++ b/src/core/thread/network_data_leader.hpp @@ -421,21 +421,24 @@ public: */ const ServiceTlv *FindServiceById(uint8_t aServiceId) const; -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE +#endif // OPENTHREAD_FTD + +#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE /** - * Indicates whether a given Prefix can act as a valid OMR prefix and exists in the network data. + * Indicates whether Network Data contains a valid OMR prefix. + * + * If the given @p aPrefix is itself not a valid OMR prefix, this method will return `false`, regardless of + * whether the prefix is present in the Network Data. * * @param[in] aPrefix The OMR prefix to check. * - * @retval TRUE If @p aPrefix is a valid OMR prefix and Network Data contains @p aPrefix. - * @retval FALSE Otherwise. + * @retval TRUE Network Data contains a valid OMR prefix entry matching @p aPrefix. + * @retval FALSE Network Data does not contain a valid OMR prefix entry matching @p aPrefix. * */ bool ContainsOmrPrefix(const Ip6::Prefix &aPrefix) const; #endif -#endif // OPENTHREAD_FTD - private: using FilterIndexes = MeshCoP::SteeringData::HashBitIndexes; diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 5905ced3d..11803c693 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -1358,41 +1358,6 @@ void Leader::HandleTimer(void) } } -#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE - -bool Leader::ContainsOmrPrefix(const Ip6::Prefix &aPrefix) const -{ - bool contains = false; - const PrefixTlv *prefixTlv; - const BorderRouterTlv *brSubTlv; - - VerifyOrExit(BorderRouter::RoutingManager::IsValidOmrPrefix(aPrefix)); - - prefixTlv = FindPrefix(aPrefix); - VerifyOrExit(prefixTlv != nullptr); - - brSubTlv = prefixTlv->FindSubTlv(/* aStable */ true); - - VerifyOrExit(brSubTlv != nullptr); - - for (const BorderRouterEntry *entry = brSubTlv->GetFirstEntry(); entry <= brSubTlv->GetLastEntry(); entry++) - { - OnMeshPrefixConfig config; - - config.SetFrom(*prefixTlv, *brSubTlv, *entry); - - if (BorderRouter::RoutingManager::IsValidOmrPrefix(config)) - { - ExitNow(contains = true); - } - } - -exit: - return contains; -} - -#endif // OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE - //--------------------------------------------------------------------------------------------------------------------- // Leader::ContextIds