[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.
This commit is contained in:
Abtin Keshavarzian
2018-04-24 10:40:00 -07:00
parent 3c9d4c8bb8
commit 864f51c024
2 changed files with 32 additions and 31 deletions
+25 -30
View File
@@ -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)
+7 -1
View File
@@ -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);