[routing-manager] use NetData::Publisher to publish external routes (#7660)

This commit updates `RoutingManager` to use `NetData::Publisher` for
external routes. This ensures to limit the number of similar entries
added in Network Data if there are many BRs within Thread mesh
discovering same set of prefixes and adding them to Thread Network
Data (avoid overflow of Thread Network Data).
This commit is contained in:
Abtin Keshavarzian
2022-05-17 15:43:44 -07:00
committed by Jonathan Hui
parent 25c610a0ed
commit d53bcde890
4 changed files with 36 additions and 27 deletions
+19 -24
View File
@@ -268,7 +268,7 @@ void RoutingManager::Stop(void)
if (mIsAdvertisingLocalOnLinkPrefix)
{
RemoveExternalRoute(mLocalOnLinkPrefix);
UnpublishExternalRoute(mLocalOnLinkPrefix);
// Start deprecating the local on-link prefix to send a PIO
// with zero preferred lifetime in `SendRouterAdvertisement`.
@@ -278,7 +278,7 @@ void RoutingManager::Stop(void)
#if OPENTHREAD_CONFIG_BORDER_ROUTING_NAT64_ENABLE
if (mIsAdvertisingLocalNat64Prefix)
{
RemoveExternalRoute(mLocalNat64Prefix);
UnpublishExternalRoute(mLocalNat64Prefix);
mIsAdvertisingLocalNat64Prefix = false;
}
#endif
@@ -545,7 +545,7 @@ bool RoutingManager::IsOmrPrefixAddedToLocalNetworkData(void) const
return Get<NetworkData::Local>().ContainsOnMeshPrefix(mLocalOmrPrefix);
}
Error RoutingManager::AddExternalRoute(const Ip6::Prefix &aPrefix, RoutePreference aRoutePreference, bool aNat64)
Error RoutingManager::PublishExternalRoute(const Ip6::Prefix &aPrefix, RoutePreference aRoutePreference, bool aNat64)
{
Error error;
NetworkData::ExternalRouteConfig routeConfig;
@@ -558,36 +558,31 @@ Error RoutingManager::AddExternalRoute(const Ip6::Prefix &aPrefix, RoutePreferen
routeConfig.mNat64 = aNat64;
routeConfig.mPreference = aRoutePreference;
error = Get<NetworkData::Local>().AddHasRoutePrefix(routeConfig);
error = Get<NetworkData::Publisher>().PublishExternalRoute(routeConfig);
if (error != kErrorNone)
{
LogWarn("Failed to add external route %s: %s", aPrefix.ToString().AsCString(), ErrorToString(error));
}
else
{
Get<NetworkData::Notifier>().HandleServerDataUpdated();
LogInfo("Adding external route %s", aPrefix.ToString().AsCString());
LogWarn("Failed to publish external route %s: %s", aPrefix.ToString().AsCString(), ErrorToString(error));
}
return error;
}
void RoutingManager::RemoveExternalRoute(const Ip6::Prefix &aPrefix)
void RoutingManager::UnpublishExternalRoute(const Ip6::Prefix &aPrefix)
{
Error error = kErrorNone;
VerifyOrExit(mIsRunning);
SuccessOrExit(error = Get<NetworkData::Local>().RemoveHasRoutePrefix(aPrefix));
error = Get<NetworkData::Publisher>().UnpublishPrefix(aPrefix);
Get<NetworkData::Notifier>().HandleServerDataUpdated();
LogInfo("Removing external route %s", aPrefix.ToString().AsCString());
exit:
if (error != kErrorNone)
{
LogWarn("Failed to remove external route %s: %s", aPrefix.ToString().AsCString(), ErrorToString(error));
LogWarn("Failed to unpublish route %s: %s", aPrefix.ToString().AsCString(), ErrorToString(error));
}
exit:
return;
}
const Ip6::Prefix *RoutingManager::EvaluateOnLinkPrefix(void)
@@ -616,7 +611,7 @@ const Ip6::Prefix *RoutingManager::EvaluateOnLinkPrefix(void)
if (smallestOnLinkPrefix == nullptr)
{
if (mIsAdvertisingLocalOnLinkPrefix ||
(AddExternalRoute(mLocalOnLinkPrefix, NetworkData::kRoutePreferenceMedium) == kErrorNone))
(PublishExternalRoute(mLocalOnLinkPrefix, NetworkData::kRoutePreferenceMedium) == kErrorNone))
{
newOnLinkPrefix = &mLocalOnLinkPrefix;
}
@@ -653,7 +648,7 @@ void RoutingManager::HandleOnLinkPrefixDeprecateTimer(Timer &aTimer)
void RoutingManager::HandleOnLinkPrefixDeprecateTimer(void)
{
LogInfo("Local on-link prefix %s expired", mLocalOnLinkPrefix.ToString().AsCString());
RemoveExternalRoute(mLocalOnLinkPrefix);
UnpublishExternalRoute(mLocalOnLinkPrefix);
}
void RoutingManager::DeprecateOnLinkPrefix(void)
@@ -697,7 +692,7 @@ void RoutingManager::EvaluateNat64Prefix(void)
// Advertise local NAT64 prefix.
if (!mIsAdvertisingLocalNat64Prefix &&
AddExternalRoute(mLocalNat64Prefix, NetworkData::kRoutePreferenceLow, /* aNat64= */ true) == kErrorNone)
PublishExternalRoute(mLocalNat64Prefix, NetworkData::kRoutePreferenceLow, /* aNat64= */ true) == kErrorNone)
{
mIsAdvertisingLocalNat64Prefix = true;
}
@@ -709,7 +704,7 @@ void RoutingManager::EvaluateNat64Prefix(void)
LogNote("Withdrawing local NAT64 prefix since a smaller one %s exists.",
smallestNat64Prefix.ToString().AsCString());
RemoveExternalRoute(mLocalNat64Prefix);
UnpublishExternalRoute(mLocalNat64Prefix);
mIsAdvertisingLocalNat64Prefix = false;
}
}
@@ -1272,7 +1267,7 @@ bool RoutingManager::UpdateDiscoveredOnLinkPrefix(const RouterAdv::PrefixInfoOpt
if (!mDiscoveredPrefixes.IsFull())
{
SuccessOrExit(AddExternalRoute(prefix, NetworkData::kRoutePreferenceMedium));
SuccessOrExit(PublishExternalRoute(prefix, NetworkData::kRoutePreferenceMedium));
existingPrefix = mDiscoveredPrefixes.PushBack();
*existingPrefix = onLinkPrefix;
needReevaluate = true;
@@ -1386,7 +1381,7 @@ void RoutingManager::UpdateDiscoveredOmrPrefix(const RouterAdv::RouteInfoOption
if (!mDiscoveredPrefixes.IsFull())
{
SuccessOrExit(AddExternalRoute(prefix, omrPrefix.mRoutePreference));
SuccessOrExit(PublishExternalRoute(prefix, omrPrefix.mRoutePreference));
existingPrefix = mDiscoveredPrefixes.PushBack();
}
else
@@ -1424,7 +1419,7 @@ void RoutingManager::InvalidateDiscoveredPrefixes(const Ip6::Prefix *aPrefix, bo
(!prefix.mIsOnLinkPrefix &&
(mAdvertisedOmrPrefixes.Contains(prefix.mPrefix) || NetworkDataContainsOmrPrefix(prefix.mPrefix))))
{
RemoveExternalRoute(prefix.mPrefix);
UnpublishExternalRoute(prefix.mPrefix);
}
else
{
+2 -2
View File
@@ -333,8 +333,8 @@ private:
Error PublishLocalOmrPrefix(void);
void UnpublishLocalOmrPrefix(void);
bool IsOmrPrefixAddedToLocalNetworkData(void) const;
Error AddExternalRoute(const Ip6::Prefix &aPrefix, RoutePreference aRoutePreference, bool aNat64 = false);
void RemoveExternalRoute(const Ip6::Prefix &aPrefix);
Error PublishExternalRoute(const Ip6::Prefix &aPrefix, RoutePreference aRoutePreference, bool aNat64 = false);
void UnpublishExternalRoute(const Ip6::Prefix &aPrefix);
void StartRouterSolicitationDelay(void);
Error SendRouterSolicitation(void);
void SendRouterAdvertisement(const OmrPrefixArray &aNewOmrPrefixes, const Ip6::Prefix *aNewOnLinkPrefix);
+9 -1
View File
@@ -35,6 +35,7 @@
#ifndef CONFIG_NETDATA_PUBLISHER_H_
#define CONFIG_NETDATA_PUBLISHER_H_
#include "config/border_router.h"
#include "config/srp_server.h"
/**
@@ -48,7 +49,8 @@
*
*/
#ifndef OPENTHREAD_CONFIG_NETDATA_PUBLISHER_ENABLE
#define OPENTHREAD_CONFIG_NETDATA_PUBLISHER_ENABLE OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
#define OPENTHREAD_CONFIG_NETDATA_PUBLISHER_ENABLE \
(OPENTHREAD_CONFIG_SRP_SERVER_ENABLE || OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE)
#endif
/**
@@ -149,7 +151,13 @@
*
*/
#ifndef OPENTHREAD_CONFIG_NETDATA_PUBLISHER_MAX_PREFIX_ENTRIES
#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
#define OPENTHREAD_CONFIG_NETDATA_PUBLISHER_MAX_PREFIX_ENTRIES \
(OPENTHREAD_CONFIG_BORDER_ROUTING_MAX_DISCOVERED_PREFIXES + 5)
#else
#define OPENTHREAD_CONFIG_NETDATA_PUBLISHER_MAX_PREFIX_ENTRIES 3
#endif
#endif
#endif // CONFIG_NETDATA_PUBLISHER_H_
@@ -43,6 +43,12 @@
"or OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE"
#endif
#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE && (OPENTHREAD_CONFIG_NETDATA_PUBLISHER_MAX_PREFIX_ENTRIES < \
(OPENTHREAD_CONFIG_BORDER_ROUTING_MAX_DISCOVERED_PREFIXES + 4))
#error "OPENTHREAD_CONFIG_NETDATA_PUBLISHER_MAX_PREFIX_ENTRIES needs to support more entries when "\
"OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE is enabled to accommodate for max on-link prefixes"
#endif
#include <openthread/netdata_publisher.h>
#include "common/clearable.hpp"