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); }