From 864f51c024a3223e57d2b0145275ac0309fe25b3 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 19 Apr 2018 14:04:39 -0700 Subject: [PATCH] [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);