mirror of
https://github.com/espressif/openthread.git
synced 2026-06-05 21:14:49 +00:00
[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:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user