From 2c21e83d893371ecc1069bf913266e8a504d5f74 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Thu, 6 Oct 2016 18:04:46 +0200 Subject: [PATCH] Handle router selection jitter timeout only once (#758) --- src/core/thread/mle.cpp | 2 +- src/core/thread/mle_router.cpp | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index e5de65500..e05cb521b 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -2165,7 +2165,7 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa (mDeviceMode & ModeTlv::kModeFFD) && (numRouters < mMleRouter.GetRouterUpgradeThreshold())) { - mRouterSelectionJitterTimeout = otPlatRandomGet() % mRouterSelectionJitter; + mRouterSelectionJitterTimeout = (otPlatRandomGet() % mRouterSelectionJitter) + 1; } } diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index ceb0a1ee1..c2f8138c8 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -1354,7 +1354,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M (mDeviceMode & ModeTlv::kModeFFD) && (GetActiveRouterCount() < mRouterUpgradeThreshold)) { - mRouterSelectionJitterTimeout = otPlatRandomGet() % mRouterSelectionJitter; + mRouterSelectionJitterTimeout = (otPlatRandomGet() % mRouterSelectionJitter) + 1; ExitNow(); } @@ -1680,6 +1680,8 @@ void MleRouter::HandleStateUpdateTimer(void *aContext) void MleRouter::HandleStateUpdateTimer(void) { + bool routerStateUpdate = false; + if (mChallengeTimeout > 0) { mChallengeTimeout--; @@ -1688,6 +1690,11 @@ void MleRouter::HandleStateUpdateTimer(void) if (mRouterSelectionJitterTimeout > 0) { mRouterSelectionJitterTimeout--; + + if (mRouterSelectionJitterTimeout == 0) + { + routerStateUpdate = true; + } } switch (GetDeviceState()) @@ -1702,8 +1709,7 @@ void MleRouter::HandleStateUpdateTimer(void) ExitNow(); case kDeviceStateChild: - if (mRouterSelectionJitterTimeout == 0 && - GetActiveRouterCount() < mRouterUpgradeThreshold) + if (routerStateUpdate && GetActiveRouterCount() < mRouterUpgradeThreshold) { // upgrade to Router BecomeRouter(ThreadStatusTlv::kTooFewRouters); @@ -1718,8 +1724,7 @@ void MleRouter::HandleStateUpdateTimer(void) BecomeChild(kMleAttachSamePartition); } - if (mRouterSelectionJitterTimeout == 0 && - GetActiveRouterCount() > mRouterDowngradeThreshold) + if (routerStateUpdate && GetActiveRouterCount() > mRouterDowngradeThreshold) { // downgrade to REED BecomeChild(kMleAttachSamePartition);