[routing-manager] utilize Network::Leader::ContainsOmrPrefix() (#10240)

This commit optimizes `RoutingManager`:

- Replaces `RoutingManager::NetworkDataContainsOmrPrefix()` with
 `ContainsOmrPrefix()`.
- Simplifies `OmrPrefixManager::ShouldAdvertiseLocalAsRio()` by
  utilizing `ContainsOmrPrefix()`.
- Relocates `ContainsOmrPrefix()` to `network_data_leader.cpp` and
  removes its FTD-only restriction.
This commit is contained in:
Abtin Keshavarzian
2024-05-15 14:05:09 -07:00
committed by GitHub
parent 6724a0bd85
commit 0a4d6d34a8
5 changed files with 46 additions and 83 deletions
+2 -41
View File
@@ -825,7 +825,7 @@ bool RoutingManager::ShouldProcessRouteInfoOption(const RouteInfoOption &aRio, c
// both checks are necessary.
VerifyOrExit(!mRioAdvertiser.HasAdvertised(aPrefix));
VerifyOrExit(!Get<RoutingManager>().NetworkDataContainsOmrPrefix(aPrefix));
VerifyOrExit(!Get<NetworkData::Leader>().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<NetworkData::Leader>().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<NetworkData::Leader>().GetNextOnMeshPrefix(iterator, prefixConfig) == kErrorNone)
{
if (!IsValidOmrPrefix(prefixConfig))
{
continue;
}
if (prefixConfig.GetPrefix() == mLocalPrefix.GetPrefix())
{
shouldAdvertise = true;
break;
}
}
exit:
return shouldAdvertise;
return mIsLocalAddedInNetData && Get<NetworkData::Leader>().ContainsOmrPrefix(mLocalPrefix.GetPrefix());
}
Error RoutingManager::OmrPrefixManager::AddLocalToNetData(void)
@@ -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);
+35
View File
@@ -607,5 +607,40 @@ void Leader::SignalNetDataChanged(void)
Get<ot::Notifier>().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<BorderRouterTlv>(/* 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
+9 -6
View File
@@ -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;
@@ -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<BorderRouterTlv>(/* 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