From c6b3c3c4b540544ffd2a9bdaf844e238c2b2dba2 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 10:02:04 -0700 Subject: [PATCH 1/4] [mle] rename MLE attach enumeration and function This commit renames some of enumeration constants, types, and variable names in `Mle` related to attach process. In particular, - `AttachState` enum & its constants (replacing `ParentRequestState`) - `mAttachTimer` instead of `mParentRequestTimer This code does not contain any logic change to the code. --- src/core/thread/mle.cpp | 72 +++++++++++++++---------------- src/core/thread/mle.hpp | 24 +++++------ src/core/thread/mle_constants.hpp | 4 +- src/core/thread/mle_router.cpp | 16 ++++--- 4 files changed, 59 insertions(+), 57 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index dada587b5..815c78176 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -66,9 +66,9 @@ Mle::Mle(Instance &aInstance) , mRetrieveNewNetworkData(false) , mRole(OT_DEVICE_ROLE_DISABLED) , mDeviceMode(ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeSecureDataRequest) - , mParentRequestState(kParentIdle) + , mAttachState(kAttachStateIdle) , mReattachState(kReattachStop) - , mParentRequestTimer(aInstance, &Mle::HandleParentRequestTimer, this) + , mAttachTimer(aInstance, &Mle::HandleAttachTimer, this) , mDelayedResponseTimer(aInstance, &Mle::HandleDelayedResponseTimer, this) , mChildUpdateRequestTimer(aInstance, &Mle::HandleChildUpdateRequestTimer, this) , mLastPartitionId(0) @@ -260,7 +260,7 @@ otError Mle::Start(bool aEnableReattach, bool aAnnounceAttach) } else { - mParentRequestState = kParentSynchronize; + mAttachState = kAttachStateSynchronize; mChildUpdateAttempts = 0; SendChildUpdateRequest(); } @@ -534,7 +534,7 @@ otError Mle::BecomeChild(AttachMode aMode) otError error = OT_ERROR_NONE; VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); - VerifyOrExit(mParentRequestState == kParentIdle, error = OT_ERROR_BUSY); + VerifyOrExit(mAttachState == kAttachStateIdle, error = OT_ERROR_BUSY); otLogInfoMle(GetInstance(), "Attempt to attach"); @@ -551,8 +551,8 @@ otError Mle::BecomeChild(AttachMode aMode) } ResetParentCandidate(); - mParentRequestState = kParentRequestStart; - mParentRequestMode = aMode; + mAttachState = kAttachStateStart; + mParentRequestMode = aMode; if (aMode != kAttachBetter) { @@ -564,7 +564,7 @@ otError Mle::BecomeChild(AttachMode aMode) netif.GetMeshForwarder().SetRxOnWhenIdle(true); - mParentRequestTimer.Start(1 + Random::GetUint32InRange(0, kParentRequestRouterTimeout)); + mAttachTimer.Start(1 + Random::GetUint32InRange(0, kParentRequestRouterTimeout)); exit: return error; @@ -585,8 +585,8 @@ otError Mle::SetStateDetached(void) } SetRole(OT_DEVICE_ROLE_DETACHED); - mParentRequestState = kParentIdle; - mParentRequestTimer.Stop(); + mAttachState = kAttachStateIdle; + mAttachTimer.Stop(); mChildUpdateRequestTimer.Stop(); netif.GetMeshForwarder().SetRxOnWhenIdle(true); netif.GetMac().SetBeaconEnabled(false); @@ -608,7 +608,7 @@ otError Mle::SetStateChild(uint16_t aRloc16) SetRloc16(aRloc16); SetRole(OT_DEVICE_ROLE_CHILD); - mParentRequestState = kParentIdle; + mAttachState = kAttachStateIdle; mReattachState = kReattachStop; mChildUpdateAttempts = 0; netif.GetMac().SetBeaconEnabled(false); @@ -1431,34 +1431,34 @@ exit: } #endif -void Mle::HandleParentRequestTimer(Timer &aTimer) +void Mle::HandleAttachTimer(Timer &aTimer) { - aTimer.GetOwner().HandleParentRequestTimer(); + aTimer.GetOwner().HandleAttachTimer(); } -void Mle::HandleParentRequestTimer(void) +void Mle::HandleAttachTimer(void) { ThreadNetif &netif = GetNetif(); - switch (mParentRequestState) + switch (mAttachState) { - case kParentIdle: + case kAttachStateIdle: assert(false); break; - case kParentSynchronize: + case kAttachStateSynchronize: SendChildUpdateRequest(); break; - case kParentRequestStart: - mParentRequestState = kParentRequestRouter; + case kAttachStateStart: + mAttachState = kAttachStateParentRequestRouter; mParentCandidate.SetState(Neighbor::kStateInvalid); mReceivedResponseFromParent = false; SendParentRequest(); break; - case kParentRequestRouter: - mParentRequestState = kParentRequestChild; + case kAttachStateParentRequestRouter: + mAttachState = kAttachStateParentRequestReed; if (mParentCandidate.GetState() != Neighbor::kStateParentResponse) { @@ -1468,20 +1468,20 @@ void Mle::HandleParentRequestTimer(void) // fall through - case kParentRequestChild: + case kAttachStateParentRequestReed: if (mParentCandidate.GetState() == Neighbor::kStateParentResponse && (mRole != OT_DEVICE_ROLE_CHILD || mReceivedResponseFromParent || mParentRequestMode == kAttachBetter) && SendChildIdRequest() == OT_ERROR_NONE) { - mParentRequestState = kChildIdRequest; - mParentRequestTimer.Start(kParentRequestChildTimeout); + mAttachState = kAttachStateChildIdRequest; + mAttachTimer.Start(kParentRequestReedTimeout); break; } // fall through - case kChildIdRequest: - mParentRequestState = kParentIdle; + case kAttachStateChildIdRequest: + mAttachState = kAttachStateIdle; ResetParentCandidate(); if (mReattachState == kReattachActive) @@ -1489,9 +1489,9 @@ void Mle::HandleParentRequestTimer(void) if (netif.GetPendingDataset().Restore() == OT_ERROR_NONE) { netif.GetPendingDataset().ApplyConfiguration(); - mReattachState = kReattachPending; - mParentRequestState = kParentRequestStart; - mParentRequestTimer.Start(kParentRequestRouterTimeout); + mReattachState = kReattachPending; + mAttachState = kAttachStateStart; + mAttachTimer.Start(kParentRequestRouterTimeout); } else { @@ -1639,9 +1639,9 @@ otError Mle::SendParentRequest(void) Random::FillBuffer(mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge)); - switch (mParentRequestState) + switch (mAttachState) { - case kParentRequestRouter: + case kAttachStateParentRequestRouter: scanMask = ScanMaskTlv::kRouterFlag; if (mParentRequestMode == kAttachSame1 || mParentRequestMode == kAttachSame2) @@ -1651,7 +1651,7 @@ otError Mle::SendParentRequest(void) break; - case kParentRequestChild: + case kAttachStateParentRequestReed: scanMask = ScanMaskTlv::kRouterFlag | ScanMaskTlv::kEndDeviceFlag; break; @@ -1685,11 +1685,11 @@ exit: if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0) { - mParentRequestTimer.Start(kParentRequestRouterTimeout); + mAttachTimer.Start(kParentRequestRouterTimeout); } else { - mParentRequestTimer.Start(kParentRequestChildTimeout); + mAttachTimer.Start(kParentRequestReedTimeout); } if (error != OT_ERROR_NONE && message != NULL) @@ -2800,7 +2800,7 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf linkQuality = LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin); - VerifyOrExit(mParentRequestState != kParentRequestRouter || linkQuality == 3); + VerifyOrExit(mAttachState != kAttachStateParentRequestRouter || linkQuality == 3); // Connectivity SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kConnectivity, sizeof(connectivity), connectivity)); @@ -2921,7 +2921,7 @@ otError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::MessageIn LogMleMessage("Receive Child ID Response", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16()); - VerifyOrExit(mParentRequestState == kChildIdRequest); + VerifyOrExit(mAttachState == kAttachStateChildIdRequest); // Leader Data SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData)); @@ -2972,7 +2972,7 @@ otError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::MessageIn } // Parent Attach Success - mParentRequestTimer.Stop(); + mAttachTimer.Stop(); SetStateDetached(); SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId()); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index a8ef01588..fd6921b7e 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1406,19 +1406,19 @@ protected: uint8_t mDeviceMode; ///< Device mode setting. /** - * States when searching for a parent. + * States during attach (when searching for a parent). * */ - enum ParentRequestState + enum AttachState { - kParentIdle, ///< Not currently searching for a parent. - kParentSynchronize, ///< Looking to synchronize with a parent (after reset). - kParentRequestStart, ///< Starting to look for a parent. - kParentRequestRouter, ///< Searching for a Router to attach to. - kParentRequestChild, ///< Searching for Routers or REEDs to attach to. - kChildIdRequest, ///< Sending a Child ID Request message. + kAttachStateIdle, ///< Not currently searching for a parent. + kAttachStateSynchronize, ///< Looking to synchronize with a parent (after reset). + kAttachStateStart, ///< Starting to look for a parent. + kAttachStateParentRequestRouter, ///< Searching for a Router to attach to. + kAttachStateParentRequestReed, ///< Searching for Routers or REEDs to attach to. + kAttachStateChildIdRequest, ///< Sending a Child ID Request message. }; - ParentRequestState mParentRequestState; ///< The parent request state. + AttachState mAttachState; ///< The parent request state. /** * States when reattaching network using stored dataset @@ -1433,7 +1433,7 @@ protected: }; ReattachState mReattachState; - TimerMilli mParentRequestTimer; ///< The timer for driving the Parent Request process. + 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 @@ -1467,8 +1467,8 @@ private: static void HandleStateChanged(Notifier::Callback &aCallback, uint32_t aFlags); void HandleStateChanged(uint32_t aFlags); - static void HandleParentRequestTimer(Timer &aTimer); - void HandleParentRequestTimer(void); + static void HandleAttachTimer(Timer &aTimer); + void HandleAttachTimer(void); static void HandleDelayedResponseTimer(Timer &aTimer); void HandleDelayedResponseTimer(void); static void HandleChildUpdateRequestTimer(Timer &aTimer); diff --git a/src/core/thread/mle_constants.hpp b/src/core/thread/mle_constants.hpp index 84f058503..fd8adb950 100644 --- a/src/core/thread/mle_constants.hpp +++ b/src/core/thread/mle_constants.hpp @@ -59,8 +59,8 @@ enum { kVersion = 2, ///< MLE Version kUdpPort = 19788, ///< MLE UDP Port - kParentRequestRouterTimeout = 750, ///< Router Request timeout - kParentRequestChildTimeout = 1250, ///< End Device Request timeout + kParentRequestRouterTimeout = 750, ///< Router Parent Request timeout + kParentRequestReedTimeout = 1250, ///< Router and REEDs Parent Request timeout kParentResponseMaxDelayRouters = 500, ///< Maximum delay for response for Parent Request sent to routers only kParentResponseMaxDelayAll = 1000, ///< Maximum delay for response for Parent Request sent to all devices kUnicastRetransmissionDelay = 1000, ///< Base delay before retransmitting an MLE unicast. diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 207c2aba2..c00eb5919 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -417,9 +417,10 @@ otError MleRouter::SetStateRouter(uint16_t aRloc16) ThreadNetif &netif = GetNetif(); SetRloc16(aRloc16); + SetRole(OT_DEVICE_ROLE_ROUTER); - mParentRequestState = kParentIdle; - mParentRequestTimer.Stop(); + mAttachState = kAttachStateIdle; + mAttachTimer.Stop(); mChildUpdateRequestTimer.Stop(); mAdvertiseTimer.Stop(); ResetAdvertiseInterval(); @@ -458,9 +459,10 @@ otError MleRouter::SetStateLeader(uint16_t aRloc16) ThreadNetif &netif = GetNetif(); SetRloc16(aRloc16); + SetRole(OT_DEVICE_ROLE_LEADER); - mParentRequestState = kParentIdle; - mParentRequestTimer.Stop(); + mAttachState = kAttachStateIdle; + mAttachTimer.Stop(); mChildUpdateRequestTimer.Stop(); mAdvertiseTimer.Stop(); ResetAdvertiseInterval(); @@ -545,7 +547,7 @@ otError MleRouter::SendAdvertisement(void) // Without this suppression, a device may send an MLE Advertisement before receiving the MLE Child ID Response. // The candidate parent then removes the attaching device because the Source Address TLV includes an RLOC16 that // indicates a Router role (i.e. a Child ID equal to zero). - VerifyOrExit(mParentRequestState == kParentIdle); + VerifyOrExit(mAttachState == kAttachStateIdle); // Suppress MLE Advertisements when transitioning to the router role. // @@ -697,7 +699,7 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); - VerifyOrExit(mParentRequestState == kParentIdle, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(mAttachState == kAttachStateIdle, error = OT_ERROR_INVALID_STATE); aMessageInfo.GetPeerAddr().ToExtAddress(macAddr); @@ -3317,7 +3319,7 @@ Neighbor *MleRouter::GetNeighbor(const Mac::ExtAddress &aAddress) } } - if (mParentRequestState != kParentIdle) + if (mAttachState != kAttachStateIdle) { rval = Mle::GetNeighbor(aAddress); } From 3c9d4c8bb8771c969ea2e7ea841acc9656f95dee Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 11:32:53 -0700 Subject: [PATCH 2/4] [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); From 864f51c024a3223e57d2b0145275ac0309fe25b3 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 14:04:39 -0700 Subject: [PATCH 3/4] [mle] update SendParentRequest() This commit updates `Mle::SendParentRequest()` method to accept a type as input parameter indicating whether the "Parent Request" is targeted for all routers or for all routers and REEDs. --- src/core/thread/mle.cpp | 55 +++++++++++++++++++---------------------- src/core/thread/mle.hpp | 8 +++++- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index c974ec670..21111f577 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1452,7 +1452,18 @@ void Mle::HandleAttachTimer(void) mAttachState = kAttachStateParentRequestRouter; mParentCandidate.SetState(Neighbor::kStateInvalid); mReceivedResponseFromParent = false; - SendParentRequest(); + + if (mParentRequestMode == kAttachSame1 || mParentRequestMode == kAttachSame2) + { + SendParentRequest(kParentRequestTypeRoutersAndReeds); + mAttachTimer.Start(kParentRequestReedTimeout); + } + else + { + SendParentRequest(kParentRequestTypeRouters); + mAttachTimer.Start(kParentRequestRouterTimeout); + } + break; case kAttachStateParentRequestRouter: @@ -1460,7 +1471,8 @@ void Mle::HandleAttachTimer(void) if (mParentCandidate.GetState() != Neighbor::kStateParentResponse) { - SendParentRequest(); + SendParentRequest(kParentRequestTypeRoutersAndReeds); + mAttachTimer.Start(kParentRequestReedTimeout); break; } @@ -1635,7 +1647,7 @@ void Mle::RemoveDelayedDataResponseMessage(void) } } -otError Mle::SendParentRequest(void) +otError Mle::SendParentRequest(ParentRequestType aType) { otError error = OT_ERROR_NONE; Message * message; @@ -1644,25 +1656,15 @@ otError Mle::SendParentRequest(void) Random::FillBuffer(mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge)); - switch (mAttachState) + switch (aType) { - case kAttachStateParentRequestRouter: + case kParentRequestTypeRouters: scanMask = ScanMaskTlv::kRouterFlag; - - if (mParentRequestMode == kAttachSame1 || mParentRequestMode == kAttachSame2) - { - scanMask |= ScanMaskTlv::kEndDeviceFlag; - } - break; - case kAttachStateParentRequestReed: + case kParentRequestTypeRoutersAndReeds: scanMask = ScanMaskTlv::kRouterFlag | ScanMaskTlv::kEndDeviceFlag; break; - - default: - assert(false); - break; } VerifyOrExit((message = NewMleMessage()) != NULL, error = OT_ERROR_NO_BUFS); @@ -1677,32 +1679,25 @@ otError Mle::SendParentRequest(void) destination.mFields.m16[7] = HostSwap16(0x0002); SuccessOrExit(error = SendMessage(*message, destination)); - if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0) + switch (aType) { + case kParentRequestTypeRouters: LogMleMessage("Send Parent Request to routers", destination); - } - else - { + break; + + case kParentRequestTypeRoutersAndReeds: LogMleMessage("Send Parent Request to routers and REEDs", destination); + break; } exit: - if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0) - { - mAttachTimer.Start(kParentRequestRouterTimeout); - } - else - { - mAttachTimer.Start(kParentRequestReedTimeout); - } - if (error != OT_ERROR_NONE && message != NULL) { message->Free(); } - return OT_ERROR_NONE; + return error; } otError Mle::SendChildIdRequest(void) diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 6141dbe1e..60b6ee45a 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1449,6 +1449,12 @@ private: kMleHopLimit = 255, }; + enum ParentRequestType + { + kParentRequestTypeRouters, ///< Parent Request to all routers. + kParentRequestTypeRoutersAndReeds, ///< Parent Request to all routers and REEDs. + }; + #if OPENTHREAD_CONFIG_ENABLE_PERIODIC_PARENT_SEARCH enum { @@ -1488,7 +1494,7 @@ private: otError HandleDiscoveryResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); otError HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - otError SendParentRequest(void); + otError SendParentRequest(ParentRequestType aType); otError SendChildIdRequest(void); void SendOrphanAnnounce(void); otError SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce, const Ip6::Address &aDestination); From a86d5ac8c9a60920f8127c197b71e295b51f510e Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 15:52:15 -0700 Subject: [PATCH 4/4] [mle] update how timer is restarted in HandleAttachTimer This commit updates `Mle::HandleAttachTimer()` so that the timer `mAttachTimer` is restarted at the end of handling all state transitions. --- src/core/thread/mle.cpp | 24 ++++++++++++++++-------- src/core/thread/mle.hpp | 10 +++++----- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 21111f577..e12e8e3d9 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1438,6 +1438,8 @@ void Mle::HandleAttachTimer(Timer &aTimer) void Mle::HandleAttachTimer(void) { + uint32_t delay = 0; + switch (mAttachState) { case kAttachStateIdle: @@ -1456,12 +1458,12 @@ void Mle::HandleAttachTimer(void) if (mParentRequestMode == kAttachSame1 || mParentRequestMode == kAttachSame2) { SendParentRequest(kParentRequestTypeRoutersAndReeds); - mAttachTimer.Start(kParentRequestReedTimeout); + delay = kParentRequestReedTimeout; } else { SendParentRequest(kParentRequestTypeRouters); - mAttachTimer.Start(kParentRequestRouterTimeout); + delay = kParentRequestRouterTimeout; } break; @@ -1472,7 +1474,7 @@ void Mle::HandleAttachTimer(void) if (mParentCandidate.GetState() != Neighbor::kStateParentResponse) { SendParentRequest(kParentRequestTypeRoutersAndReeds); - mAttachTimer.Start(kParentRequestReedTimeout); + delay = kParentRequestReedTimeout; break; } @@ -1484,7 +1486,7 @@ void Mle::HandleAttachTimer(void) SendChildIdRequest() == OT_ERROR_NONE) { mAttachState = kAttachStateChildIdRequest; - mAttachTimer.Start(kParentRequestReedTimeout); + delay = kParentRequestReedTimeout; break; } @@ -1493,14 +1495,20 @@ void Mle::HandleAttachTimer(void) case kAttachStateChildIdRequest: mAttachState = kAttachStateIdle; ResetParentCandidate(); - Reattach(); + delay = Reattach(); break; } + + if (delay != 0) + { + mAttachTimer.Start(delay); + } } -void Mle::Reattach(void) +uint32_t Mle::Reattach(void) { ThreadNetif &netif = GetNetif(); + uint32_t delay = 0; if (mReattachState == kReattachActive) { @@ -1509,7 +1517,7 @@ void Mle::Reattach(void) netif.GetPendingDataset().ApplyConfiguration(); mReattachState = kReattachPending; mAttachState = kAttachStateStart; - mAttachTimer.Start(kParentRequestRouterTimeout); + delay = kParentRequestRouterTimeout; } else { @@ -1568,7 +1576,7 @@ void Mle::Reattach(void) } exit: - return; + return delay; } void Mle::HandleDelayedResponseTimer(Timer &aTimer) diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 60b6ee45a..c77cc2118 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1494,11 +1494,11 @@ private: otError HandleDiscoveryResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); otError HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - otError SendParentRequest(ParentRequestType aType); - otError SendChildIdRequest(void); - void SendOrphanAnnounce(void); - otError SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce, const Ip6::Address &aDestination); - void Reattach(void); + otError SendParentRequest(ParentRequestType aType); + otError SendChildIdRequest(void); + void SendOrphanAnnounce(void); + otError SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce, const Ip6::Address &aDestination); + uint32_t Reattach(void); bool IsBetterParent(uint16_t aRloc16, uint8_t aLinkQuality, uint8_t aLinkMargin, ConnectivityTlv &aConnectivityTlv); void ResetParentCandidate(void);