From 4fe428d0793231c1fa6dd378a3e4b172c21ed8f9 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 15 May 2024 10:29:07 -0700 Subject: [PATCH] [network-data] optimize `ContainsOmrPrefix()` (#10239) This commit simplifies the `Leader::ContainsOmrPrefix()` method by eliminating the loop over sub-TLVs based on stable flag status. Since OMR prefixes must be marked as stable, the search for a given OMR prefix can be restricted to stable sub-TLV only. --- src/core/thread/network_data_leader.hpp | 2 +- src/core/thread/network_data_leader_ftd.cpp | 40 ++++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/core/thread/network_data_leader.hpp b/src/core/thread/network_data_leader.hpp index 4ad1a99f0..597689199 100644 --- a/src/core/thread/network_data_leader.hpp +++ b/src/core/thread/network_data_leader.hpp @@ -431,7 +431,7 @@ public: * @retval FALSE Otherwise. * */ - bool ContainsOmrPrefix(const Ip6::Prefix &aPrefix); + bool ContainsOmrPrefix(const Ip6::Prefix &aPrefix) const; #endif #endif // OPENTHREAD_FTD diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 5cfc44e56..5905ced3d 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -1358,44 +1358,40 @@ void Leader::HandleTimer(void) } } -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE -bool Leader::ContainsOmrPrefix(const Ip6::Prefix &aPrefix) +#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE + +bool Leader::ContainsOmrPrefix(const Ip6::Prefix &aPrefix) const { - PrefixTlv *prefixTlv; - bool contains = false; + bool contains = false; + const PrefixTlv *prefixTlv; + const BorderRouterTlv *brSubTlv; VerifyOrExit(BorderRouter::RoutingManager::IsValidOmrPrefix(aPrefix)); prefixTlv = FindPrefix(aPrefix); VerifyOrExit(prefixTlv != nullptr); - for (int i = 0; i < 2; i++) + brSubTlv = prefixTlv->FindSubTlv(/* aStable */ true); + + VerifyOrExit(brSubTlv != nullptr); + + for (const BorderRouterEntry *entry = brSubTlv->GetFirstEntry(); entry <= brSubTlv->GetLastEntry(); entry++) { - const BorderRouterTlv *borderRouter = prefixTlv->FindSubTlv(/* aStable */ (i == 0)); + OnMeshPrefixConfig config; - if (borderRouter == nullptr) + config.SetFrom(*prefixTlv, *brSubTlv, *entry); + + if (BorderRouter::RoutingManager::IsValidOmrPrefix(config)) { - continue; - } - - for (const BorderRouterEntry *entry = borderRouter->GetFirstEntry(); entry <= borderRouter->GetLastEntry(); - entry = entry->GetNext()) - { - OnMeshPrefixConfig config; - - config.SetFrom(*prefixTlv, *borderRouter, *entry); - - if (BorderRouter::RoutingManager::IsValidOmrPrefix(config)) - { - ExitNow(contains = true); - } + ExitNow(contains = true); } } exit: return contains; } -#endif + +#endif // OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE //--------------------------------------------------------------------------------------------------------------------- // Leader::ContextIds