diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 80aeac3fa..3b1a75582 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -2122,6 +2122,7 @@ void RoutingManager::OnLinkPrefixManager::GenerateLocalPrefix(void) { const MeshCoP::ExtendedPanId &extPanId = Get().GetExtPanId(); OldPrefix * entry; + Ip6::Prefix oldLocalPrefix = mLocalPrefix; // Global ID: 40 most significant bits of Extended PAN ID // Subnet ID: 16 least significant bits of Extended PAN ID @@ -2132,6 +2133,11 @@ void RoutingManager::OnLinkPrefixManager::GenerateLocalPrefix(void) mLocalPrefix.SetLength(kOnLinkPrefixLength); + // We ensure that the local prefix did change, since not all the + // bytes in Extended PAN ID are used in derivation of the local prefix. + + VerifyOrExit(mLocalPrefix != oldLocalPrefix); + LogNote("Local on-link prefix: %s", mLocalPrefix.ToString().AsCString()); // Check if the new local prefix happens to be in `mOldLocalPrefixes` array. @@ -2149,6 +2155,9 @@ void RoutingManager::OnLinkPrefixManager::GenerateLocalPrefix(void) { mState = kIdle; } + +exit: + return; } void RoutingManager::OnLinkPrefixManager::Start(void) @@ -2462,6 +2471,8 @@ void RoutingManager::OnLinkPrefixManager::HandleExtPanIdChange(void) GenerateLocalPrefix(); + VerifyOrExit(oldPrefix != mLocalPrefix); + switch (oldState) { case kIdle: @@ -2481,6 +2492,9 @@ void RoutingManager::OnLinkPrefixManager::HandleExtPanIdChange(void) { Get().ScheduleRoutingPolicyEvaluation(kAfterRandomDelay); } + +exit: + return; } void RoutingManager::OnLinkPrefixManager::DeprecateOldPrefix(const Ip6::Prefix &aPrefix, TimeMilli aExpireTime) diff --git a/tests/unit/test_routing_manager.cpp b/tests/unit/test_routing_manager.cpp index cf0a24124..76672fc2b 100644 --- a/tests/unit/test_routing_manager.cpp +++ b/tests/unit/test_routing_manager.cpp @@ -829,7 +829,7 @@ void VerifyPrefixTable(const OnLinkPrefix *aOnLinkPrefixes, VerifyOrQuit(routePrefixCount == aNumRoutePrefixes); } -void InitTest(void) +void InitTest(bool aEnablBorderRouting = false) { //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Initialize OT instance. @@ -843,13 +843,14 @@ void InitTest(void) SuccessOrQuit(sInfraIfAddress.FromString(kInfraIfAddress)); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Initialize Border Router and start Thread operation. + // Initialize and start Border Router and Thread operation. SuccessOrQuit(otBorderRoutingInit(sInstance, kInfraIfIndex, /* aInfraIfIsRunning */ true)); SuccessOrQuit(otLinkSetPanId(sInstance, 0x1234)); SuccessOrQuit(otIp6SetEnabled(sInstance, true)); SuccessOrQuit(otThreadSetEnabled(sInstance, true)); + SuccessOrQuit(otBorderRoutingSetEnabled(sInstance, aEnablBorderRouting)); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Ensure device starts as leader. @@ -2514,18 +2515,16 @@ void TestSavedOnLinkPrefixes(void) Log("--------------------------------------------------------------------------------------------"); Log("TestSavedOnLinkPrefixes"); - InitTest(); + InitTest(/* aEnablBorderRouting */ true); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Start Routing Manager. Check emitted RS and RA messages. + // Check emitted RS and RA messages. sRsEmitted = false; sRaValidated = false; sExpectedPio = kPioAdvertisingLocalOnLink; sExpectedRios.Clear(); - SuccessOrQuit(sInstance->Get().SetEnabled(true)); - SuccessOrQuit(sInstance->Get().GetOnLinkPrefix(localOnLink)); SuccessOrQuit(sInstance->Get().GetOmrPrefix(localOmr)); @@ -2553,10 +2552,7 @@ void TestSavedOnLinkPrefixes(void) testFreeInstance(sInstance); - InitTest(); - - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Start Routing Manager. + InitTest(/* aEnablBorderRouting */ true); SuccessOrQuit(sInstance->Get().SetEnabled(true)); @@ -2594,12 +2590,7 @@ void TestSavedOnLinkPrefixes(void) testFreeInstance(sInstance); - InitTest(); - - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Start Routing Manager. - - SuccessOrQuit(sInstance->Get().SetEnabled(true)); + InitTest(/* aEnablBorderRouting */ true); sExpectedPio = kPioAdvertisingLocalOnLink;