From c319046599e68f3c85ae050f574ad267be8c0d53 Mon Sep 17 00:00:00 2001 From: Simon Lin Date: Tue, 24 May 2022 02:04:28 +0800 Subject: [PATCH] [routing-manager] fix BR incorrectly removing route for local on-link prefix (#7724) This commit fixes a bug that BR could incorrectly remove the route of the local on-link prefix in Network Data when it's still advertising the local on-link prefix. This is a short-term fix because in the long term we want to refactor how `RoutingManager` manages external routes and the default route. --- src/core/border_router/routing_manager.cpp | 44 +++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 341d9d49c..f6a7a4eca 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -616,8 +616,25 @@ void RoutingManager::HandleOnLinkPrefixDeprecateTimer(Timer &aTimer) void RoutingManager::HandleOnLinkPrefixDeprecateTimer(void) { + bool discoveredLocalOnLinkPrefix = false; + + OT_ASSERT(!mIsAdvertisingLocalOnLinkPrefix); + LogInfo("Local on-link prefix %s expired", mLocalOnLinkPrefix.ToString().AsCString()); - UnpublishExternalRoute(mLocalOnLinkPrefix); + + for (const ExternalPrefix &prefix : mDiscoveredPrefixes) + { + if (prefix.mIsOnLinkPrefix && prefix.mPrefix == mLocalOnLinkPrefix) + { + discoveredLocalOnLinkPrefix = true; + break; + } + } + + if (!discoveredLocalOnLinkPrefix) + { + UnpublishExternalRoute(mLocalOnLinkPrefix); + } } void RoutingManager::DeprecateOnLinkPrefix(void) @@ -726,8 +743,17 @@ void RoutingManager::EvaluateRoutingPolicy(void) } // 3. Update advertised on-link & OMR prefixes information. - mIsAdvertisingLocalOnLinkPrefix = (newOnLinkPrefix == &mLocalOnLinkPrefix); - mAdvertisedOmrPrefixes = newOmrPrefixes; + { + bool wasAdvertisingLocalOnLinkPrefix = mIsAdvertisingLocalOnLinkPrefix; + + mIsAdvertisingLocalOnLinkPrefix = (newOnLinkPrefix == &mLocalOnLinkPrefix); + if (!wasAdvertisingLocalOnLinkPrefix && mIsAdvertisingLocalOnLinkPrefix) + { + InvalidateDiscoveredPrefixes(); + } + + mAdvertisedOmrPrefixes = newOmrPrefixes; + } } void RoutingManager::StartRoutingPolicyEvaluationJitter(uint32_t aJitterMilli) @@ -1382,6 +1408,9 @@ void RoutingManager::InvalidateDiscoveredPrefixes(const Ip6::Prefix *aPrefix, bo for (const ExternalPrefix &prefix : mDiscoveredPrefixes) { + bool isAdvertisedLocalOnLinkPrefix = + mIsAdvertisingLocalOnLinkPrefix && prefix.mIsOnLinkPrefix && mLocalOnLinkPrefix == prefix.mPrefix; + if ( // Invalidate specified prefix (aPrefix != nullptr && prefix.mPrefix == *aPrefix && prefix.mIsOnLinkPrefix == aIsOnLinkPrefix) || @@ -1389,9 +1418,14 @@ void RoutingManager::InvalidateDiscoveredPrefixes(const Ip6::Prefix *aPrefix, bo (prefix.GetExpireTime() <= now) || // Invalidate Local OMR prefixes (!prefix.mIsOnLinkPrefix && - (mAdvertisedOmrPrefixes.Contains(prefix.mPrefix) || NetworkDataContainsOmrPrefix(prefix.mPrefix)))) + (mAdvertisedOmrPrefixes.Contains(prefix.mPrefix) || NetworkDataContainsOmrPrefix(prefix.mPrefix))) || + // Remove local on-link prefix if the BR is advertising on-link prefix + isAdvertisedLocalOnLinkPrefix) { - UnpublishExternalRoute(prefix.mPrefix); + if (!isAdvertisedLocalOnLinkPrefix) + { + UnpublishExternalRoute(prefix.mPrefix); + } } else {