mirror of
https://github.com/espressif/openthread.git
synced 2026-08-20 09:29:51 +00:00
[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:
committed by
Jonathan Hui
parent
25c610a0ed
commit
d53bcde890
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user