diff --git a/src/core/backbone_router/bbr_local.cpp b/src/core/backbone_router/bbr_local.cpp index 9952583b2..862860fef 100644 --- a/src/core/backbone_router/bbr_local.cpp +++ b/src/core/backbone_router/bbr_local.cpp @@ -52,7 +52,7 @@ Local::Local(Instance &aInstance) , mState(OT_BACKBONE_ROUTER_STATE_DISABLED) , mMlrTimeout(Mle::kMlrTimeoutDefault) , mReregistrationDelay(Mle::kRegistrationDelayDefault) - , mSequenceNumber(Random::NonCrypto::GetUint8()) + , mSequenceNumber(Random::NonCrypto::GetUint8() % 127) , mRegistrationJitter(Mle::kBackboneRouterRegistrationJitter) , mIsServiceAdded(false) , mDomainPrefixCallback(nullptr) @@ -112,7 +112,7 @@ void Local::Reset(void) if (mState == OT_BACKBONE_ROUTER_STATE_PRIMARY) { // Increase sequence number when changing from Primary to Secondary. - mSequenceNumber++; + SequenceNumberIncrease(); Get().Signal(kEventThreadBackboneRouterLocalChanged); SetState(OT_BACKBONE_ROUTER_STATE_SECONDARY); } @@ -270,7 +270,7 @@ void Local::HandleBackboneRouterPrimaryUpdate(Leader::State aState, const Backbo { // Here original PBBR restores its Backbone Router Service from Thread Network, // Intentionally skips the state update as PBBR will refresh its service. - mSequenceNumber = aConfig.mSequenceNumber + 1; + mSequenceNumber = aConfig.mSequenceNumber; mReregistrationDelay = aConfig.mReregistrationDelay; mMlrTimeout = aConfig.mMlrTimeout; @@ -278,9 +278,13 @@ void Local::HandleBackboneRouterPrimaryUpdate(Leader::State aState, const Backbo if (mSkipSeqNumIncrease) { // BBR-TC-02 forces Sequence Number for the reference device with raw UDP API - mSequenceNumber = aConfig.mSequenceNumber; + // Do not increase Sequence Number in that case. } + else #endif + { + SequenceNumberIncrease(); + } Get().Signal(kEventThreadBackboneRouterLocalChanged); if (AddService(true /* Force registration to refresh and restore Primary state */) == kErrorNone) @@ -424,6 +428,24 @@ void Local::RemoveDomainPrefixFromNetworkData(void) LogDomainPrefix("Remove", error); } +void Local::SequenceNumberIncrease(void) +{ + switch (mSequenceNumber) + { + case 126: + case 127: + mSequenceNumber = 0; + break; + case 254: + case 255: + mSequenceNumber = 128; + break; + default: + mSequenceNumber++; + break; + } +} + void Local::AddDomainPrefixToNetworkData(void) { Error error = kErrorNotFound; // only used for logging. diff --git a/src/core/backbone_router/bbr_local.hpp b/src/core/backbone_router/bbr_local.hpp index f4878eab1..23c337a35 100644 --- a/src/core/backbone_router/bbr_local.hpp +++ b/src/core/backbone_router/bbr_local.hpp @@ -273,6 +273,7 @@ private: void RemoveService(void); void AddDomainPrefixToNetworkData(void); void RemoveDomainPrefixFromNetworkData(void); + void SequenceNumberIncrease(void); #if (OPENTHREAD_CONFIG_LOG_LEVEL >= OT_LOG_LEVEL_INFO) && (OPENTHREAD_CONFIG_LOG_BBR == 1) void LogBackboneRouterService(const char *aAction, Error aError); void LogDomainPrefix(const char *aAction, Error aError); diff --git a/tools/harness-thci/OpenThread.py b/tools/harness-thci/OpenThread.py index a78eb6cef..95915ee43 100644 --- a/tools/harness-thci/OpenThread.py +++ b/tools/harness-thci/OpenThread.py @@ -1607,7 +1607,7 @@ class OpenThreadTHCI(object): self.stopListeningToAddrAll() # BBR dataset - self.bbrSeqNum = random.randint(0, 254) # random seqnum except 255, so that BBR-TC-02 never need re-run + self.bbrSeqNum = random.randint(0, 126) # 5.21.4.2 self.bbrMlrTimeout = 3600 self.bbrReRegDelay = 5 @@ -3182,7 +3182,12 @@ class OpenThreadTHCI(object): """ assert not (SeqNumInc and SeqNum is not None), "Must not specify both SeqNumInc and SeqNum" if SeqNumInc: - SeqNum = (self.bbrSeqNum + 1) % 256 + if self.bbrSeqNum in (126, 127): + self.bbrSeqNum = 0 + elif self.bbrSeqNum in (254, 255): + self.bbrSeqNum = 128 + else: + self.bbrSeqNum = (self.bbrSeqNum + 1) % 256 return self.__configBbrDataset(SeqNum=SeqNum, MlrTimeout=MlrTimeout, ReRegDelay=ReRegDelay)