[bbr] implement new Sequence Number increase rules (#7342)

"BBR Sequence Number Updating" section in Thread Specification
requires special wraps when increasing BBR Dataset Sequence Number.
This commit is contained in:
Eduardo Montoya
2022-01-26 03:20:36 +01:00
committed by GitHub
parent 3ef867602e
commit d4e041096f
3 changed files with 34 additions and 6 deletions
+26 -4
View File
@@ -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<Notifier>().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<Notifier>().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.
+1
View File
@@ -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);
+7 -2
View File
@@ -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)