From 3c9d4c8bb8771c969ea2e7ea841acc9656f95dee Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 11:32:53 -0700 Subject: [PATCH] [mle] refactor the reattach logic into a method This commit moves the logic related to reattach process (after a timeout waiting for "Child ID Response") into a new method `Mle::Reattach()`. --- src/core/thread/mle.cpp | 119 +++++++++++++++++++++------------------- src/core/thread/mle.hpp | 1 + 2 files changed, 63 insertions(+), 57 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 815c78176..c974ec670 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1438,8 +1438,6 @@ void Mle::HandleAttachTimer(Timer &aTimer) void Mle::HandleAttachTimer(void) { - ThreadNetif &netif = GetNetif(); - switch (mAttachState) { case kAttachStateIdle: @@ -1483,75 +1481,82 @@ void Mle::HandleAttachTimer(void) case kAttachStateChildIdRequest: mAttachState = kAttachStateIdle; ResetParentCandidate(); + Reattach(); + break; + } +} - if (mReattachState == kReattachActive) +void Mle::Reattach(void) +{ + ThreadNetif &netif = GetNetif(); + + if (mReattachState == kReattachActive) + { + if (netif.GetPendingDataset().Restore() == OT_ERROR_NONE) { - if (netif.GetPendingDataset().Restore() == OT_ERROR_NONE) - { - netif.GetPendingDataset().ApplyConfiguration(); - mReattachState = kReattachPending; - mAttachState = kAttachStateStart; - mAttachTimer.Start(kParentRequestRouterTimeout); - } - else - { - mReattachState = kReattachStop; - } + netif.GetPendingDataset().ApplyConfiguration(); + mReattachState = kReattachPending; + mAttachState = kAttachStateStart; + mAttachTimer.Start(kParentRequestRouterTimeout); } - else if (mReattachState == kReattachPending) + else { mReattachState = kReattachStop; - netif.GetActiveDataset().Restore(); } + } + else if (mReattachState == kReattachPending) + { + mReattachState = kReattachStop; + netif.GetActiveDataset().Restore(); + } - if (mReattachState == kReattachStop) + VerifyOrExit(mReattachState == kReattachStop); + + switch (mParentRequestMode) + { + case kAttachAny: + if (mRole != OT_DEVICE_ROLE_CHILD) { - switch (mParentRequestMode) + if (mPreviousPanId != Mac::kPanIdBroadcast) { - case kAttachAny: - if (mRole != OT_DEVICE_ROLE_CHILD) - { - if (mPreviousPanId != Mac::kPanIdBroadcast) - { - netif.GetMac().SetChannel(mPreviousChannel); - netif.GetMac().SetPanId(mPreviousPanId); - mPreviousPanId = Mac::kPanIdBroadcast; - BecomeDetached(); - } - else if ((mDeviceMode & ModeTlv::kModeFFD) == 0) - { - SendOrphanAnnounce(); - BecomeDetached(); - } - else if (netif.GetMle().BecomeLeader() != OT_ERROR_NONE) - { - BecomeDetached(); - } - } - else if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0) - { - // return to sleepy operation - netif.GetMeshForwarder().GetDataPollManager().SetAttachMode(false); - netif.GetMeshForwarder().SetRxOnWhenIdle(false); - } - - break; - - case kAttachSame1: - BecomeChild(kAttachSame2); - break; - - case kAttachSame2: - BecomeChild(kAttachAny); - break; - - case kAttachBetter: - break; + netif.GetMac().SetChannel(mPreviousChannel); + netif.GetMac().SetPanId(mPreviousPanId); + mPreviousPanId = Mac::kPanIdBroadcast; + BecomeDetached(); } + else if ((mDeviceMode & ModeTlv::kModeFFD) == 0) + { + SendOrphanAnnounce(); + BecomeDetached(); + } + else if (netif.GetMle().BecomeLeader() != OT_ERROR_NONE) + { + BecomeDetached(); + } + } + else if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0) + { + // return to sleepy operation + netif.GetMeshForwarder().GetDataPollManager().SetAttachMode(false); + netif.GetMeshForwarder().SetRxOnWhenIdle(false); } break; + + case kAttachSame1: + BecomeChild(kAttachSame2); + break; + + case kAttachSame2: + BecomeChild(kAttachAny); + break; + + case kAttachBetter: + break; } + +exit: + return; } void Mle::HandleDelayedResponseTimer(Timer &aTimer) diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index fd6921b7e..6141dbe1e 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1492,6 +1492,7 @@ private: otError SendChildIdRequest(void); void SendOrphanAnnounce(void); otError SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce, const Ip6::Address &aDestination); + void Reattach(void); bool IsBetterParent(uint16_t aRloc16, uint8_t aLinkQuality, uint8_t aLinkMargin, ConnectivityTlv &aConnectivityTlv); void ResetParentCandidate(void);