mirror of
https://github.com/espressif/openthread.git
synced 2026-08-01 00:27:47 +00:00
[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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user