From a86d5ac8c9a60920f8127c197b71e295b51f510e Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 15:52:15 -0700 Subject: [PATCH] [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);