From 664d9832e5f4b26612bff7e654fe3aaac37dc135 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Sun, 6 May 2018 15:22:06 -0700 Subject: [PATCH] [mle] move previous partition state into FTD code (#2697) Previous partition state is only used by FTDs. --- src/core/thread/mle.cpp | 6 ------ src/core/thread/mle.hpp | 9 +++------ src/core/thread/mle_router.cpp | 23 +++++++++++++++-------- src/core/thread/mle_router_ftd.hpp | 10 +++++++--- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index e12e8e3d9..4effbf9c2 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -71,9 +71,6 @@ Mle::Mle(Instance &aInstance) , mAttachTimer(aInstance, &Mle::HandleAttachTimer, this) , mDelayedResponseTimer(aInstance, &Mle::HandleDelayedResponseTimer, this) , mChildUpdateRequestTimer(aInstance, &Mle::HandleChildUpdateRequestTimer, this) - , mLastPartitionId(0) - , mLastPartitionRouterIdSequence(0) - , mLastPartitionIdTimeout(0) , mParentLeaderCost(0) , mParentRequestMode(kAttachAny) , mParentPriority(0) @@ -849,9 +846,6 @@ void Mle::SetLeaderData(uint32_t aPartitionId, uint8_t aWeighting, uint8_t aLead if (mLeaderData.GetPartitionId() != aPartitionId) { GetNetif().GetMle().HandlePartitionChange(); - mLastPartitionId = mLeaderData.GetPartitionId(); - mLastPartitionRouterIdSequence = GetNetif().GetMle().GetRouterIdSequence(); - mLastPartitionIdTimeout = GetNetif().GetMle().GetNetworkIdTimeout(); GetNotifier().SetFlags(OT_CHANGED_THREAD_PARTITION_ID); } diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index c77cc2118..b4ae1ada4 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1433,12 +1433,9 @@ protected: }; ReattachState mReattachState; - TimerMilli mAttachTimer; ///< The timer for driving the attach process. - TimerMilli mDelayedResponseTimer; ///< The timer to delay MLE responses. - TimerMilli mChildUpdateRequestTimer; ///< The timer for sending MLE Child Update Request messages. - uint32_t mLastPartitionId; ///< The partition ID of the previous Thread partition - uint8_t mLastPartitionRouterIdSequence; ///< The router ID sequence from the previous Thread partition - uint8_t mLastPartitionIdTimeout; ///< The time remaining to avoid the previous Thread partition + TimerMilli mAttachTimer; ///< The timer for driving the attach process. + TimerMilli mDelayedResponseTimer; ///< The timer to delay MLE responses. + TimerMilli mChildUpdateRequestTimer; ///< The timer for sending MLE Child Update Request messages. uint8_t mParentLeaderCost; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index c00eb5919..65e7b6de5 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -75,7 +75,10 @@ MleRouter::MleRouter(Instance &aInstance) , mFixedLeaderPartitionId(0) , mRouterRoleEnabled(true) , mAddressSolicitPending(false) + , mPreviousPartitionIdRouter(0) , mPreviousPartitionId(0) + , mPreviousPartitionRouterIdSequence(0) + , mPreviousPartitionIdTimeout(0) , mRouterSelectionJitter(kRouterSelectionJitter) , mRouterSelectionJitterTimeout(0) , mParentPriority(kParentPriorityUnspecified) @@ -91,6 +94,10 @@ void MleRouter::HandlePartitionChange(void) { ThreadNetif &netif = GetNetif(); + mPreviousPartitionId = mLeaderData.GetPartitionId(); + mPreviousPartitionRouterIdSequence = netif.GetMle().GetRouterIdSequence(); + mPreviousPartitionIdTimeout = netif.GetMle().GetNetworkIdTimeout(); + netif.GetAddressResolver().Clear(); netif.GetCoap().AbortTransaction(&MleRouter::HandleAddressSolicitResponse, this); } @@ -394,7 +401,7 @@ otError MleRouter::HandleChildStart(AttachMode aMode) case kAttachAny: case kAttachBetter: - if (HasChildren() && mPreviousPartitionId != mLeaderData.GetPartitionId()) + if (HasChildren() && mPreviousPartitionIdRouter != mLeaderData.GetPartitionId()) { BecomeRouter(ThreadStatusTlv::kParentPartitionChange); } @@ -427,7 +434,7 @@ otError MleRouter::SetStateRouter(uint16_t aRloc16) netif.SubscribeAllRoutersMulticast(); mRouters[mRouterId].SetNextHop(mRouterId); - mPreviousPartitionId = mLeaderData.GetPartitionId(); + mPreviousPartitionIdRouter = mLeaderData.GetPartitionId(); netif.GetNetworkDataLeader().Stop(); netif.GetIp6().SetForwardingEnabled(true); netif.GetIp6().GetMpl().SetTimerExpirations(kMplRouterDataMessageTimerExpirations); @@ -470,7 +477,7 @@ otError MleRouter::SetStateLeader(uint16_t aRloc16) netif.SubscribeAllRoutersMulticast(); mRouters[mRouterId].SetNextHop(mRouterId); - mPreviousPartitionId = mLeaderData.GetPartitionId(); + mPreviousPartitionIdRouter = mLeaderData.GetPartitionId(); mStateUpdateTimer.Start(kStateUpdatePeriod); mRouters[mRouterId].SetLastHeard(TimerMilli::GetNow()); @@ -1329,10 +1336,10 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa VerifyOrExit(linkMargin >= OPENTHREAD_CONFIG_MLE_PARTITION_MERGE_MARGIN_MIN, error = OT_ERROR_LINK_MARGIN_LOW); - if (route.IsValid() && (mDeviceMode & ModeTlv::kModeFFD) && (mLastPartitionIdTimeout > 0) && - (partitionId == mLastPartitionId)) + if (route.IsValid() && (mDeviceMode & ModeTlv::kModeFFD) && (mPreviousPartitionIdTimeout > 0) && + (partitionId == mPreviousPartitionId)) { - VerifyOrExit((static_cast(route.GetRouterIdSequence() - mLastPartitionRouterIdSequence) > 0), + VerifyOrExit((static_cast(route.GetRouterIdSequence() - mPreviousPartitionRouterIdSequence) > 0), error = OT_ERROR_DROP); } @@ -1753,9 +1760,9 @@ void MleRouter::HandleStateUpdateTimer(void) mChallengeTimeout--; } - if (mLastPartitionIdTimeout > 0) + if (mPreviousPartitionIdTimeout > 0) { - mLastPartitionIdTimeout--; + mPreviousPartitionIdTimeout--; } if (mRouterSelectionJitterTimeout > 0) diff --git a/src/core/thread/mle_router_ftd.hpp b/src/core/thread/mle_router_ftd.hpp index a6cf85c8e..55674b1df 100644 --- a/src/core/thread/mle_router_ftd.hpp +++ b/src/core/thread/mle_router_ftd.hpp @@ -873,9 +873,13 @@ private: bool mRouterRoleEnabled : 1; bool mAddressSolicitPending : 1; - uint8_t mRouterId; - uint8_t mPreviousRouterId; - uint32_t mPreviousPartitionId; + uint8_t mRouterId; + uint8_t mPreviousRouterId; + + uint32_t mPreviousPartitionIdRouter; ///< The partition ID when last operating as a router + uint32_t mPreviousPartitionId; ///< The partition ID when last attached + uint8_t mPreviousPartitionRouterIdSequence; ///< The router ID sequence when last attached + uint8_t mPreviousPartitionIdTimeout; ///< The partition ID timeout when last attached uint8_t mRouterSelectionJitter; ///< The variable to save the assigned jitter value. uint8_t mRouterSelectionJitterTimeout; ///< The Timeout prior to request/release Router ID.