From d360c4b601201c1ce7762b5e2d08d2f4a8954b9c Mon Sep 17 00:00:00 2001 From: Simon Lin Date: Fri, 25 Jun 2021 01:30:49 +0800 Subject: [PATCH] [backbone-router] fix Leader isn't always selected as PBBR (#6751) --- src/core/thread/network_data_service.cpp | 24 +++++++++++++++++++----- src/core/thread/network_data_service.hpp | 7 +++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/core/thread/network_data_service.cpp b/src/core/thread/network_data_service.cpp index e1493dd19..4f14c2bdf 100644 --- a/src/core/thread/network_data_service.cpp +++ b/src/core/thread/network_data_service.cpp @@ -119,11 +119,7 @@ void Manager::GetBackboneRouterPrimary(ot::BackboneRouter::BackboneRouterConfig serverData = reinterpret_cast(iterator.mServerSubTlv->GetServerData()); if (rvalServerTlv == nullptr || - (iterator.mServerSubTlv->GetServer16() == - Mle::Mle::Rloc16FromRouterId(Get().GetLeaderId())) || - serverData->GetSequenceNumber() > rvalServerData->GetSequenceNumber() || - (serverData->GetSequenceNumber() == rvalServerData->GetSequenceNumber() && - iterator.mServerSubTlv->GetServer16() > rvalServerTlv->GetServer16())) + IsBackboneRouterPreferredTo(*iterator.mServerSubTlv, *serverData, *rvalServerTlv, *rvalServerData)) { rvalServerTlv = iterator.mServerSubTlv; rvalServerData = serverData; @@ -141,6 +137,24 @@ exit: return; } +bool Manager::IsBackboneRouterPreferredTo(const ServerTlv & aServerTlv, + const BackboneRouter::ServerData &aServerData, + const ServerTlv & aOtherServerTlv, + const BackboneRouter::ServerData &aOtherServerData) const +{ + bool isPreferred; + uint16_t leaderRloc16 = Mle::Mle::Rloc16FromRouterId(Get().GetLeaderId()); + + VerifyOrExit(aServerTlv.GetServer16() != leaderRloc16, isPreferred = true); + VerifyOrExit(aOtherServerTlv.GetServer16() != leaderRloc16, isPreferred = false); + + isPreferred = aServerData.GetSequenceNumber() > aOtherServerData.GetSequenceNumber() || + (aServerData.GetSequenceNumber() == aOtherServerData.GetSequenceNumber() && + aServerTlv.GetServer16() > aOtherServerTlv.GetServer16()); +exit: + return isPreferred; +} + #endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2) Error Manager::GetNextDnsSrpAnycastInfo(Iterator &aIterator, DnsSrpAnycast::Info &aInfo) const diff --git a/src/core/thread/network_data_service.hpp b/src/core/thread/network_data_service.hpp index 3a7ceef62..a93759a51 100644 --- a/src/core/thread/network_data_service.hpp +++ b/src/core/thread/network_data_service.hpp @@ -623,6 +623,13 @@ private: bool aServerStable, uint8_t & aServiceId) const; Error IterateToNextServer(Iterator &aIterator) const; + +#if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2) + bool IsBackboneRouterPreferredTo(const ServerTlv & aServerTlv, + const BackboneRouter::ServerData &aServerData, + const ServerTlv & aOtherServerTlv, + const BackboneRouter::ServerData &aOtherServerData) const; +#endif }; } // namespace Service