Implement reattach process using stored dataset (#894)

This commit is contained in:
Shu Chen
2016-10-31 08:56:52 -07:00
committed by Jonathan Hui
parent 1de494ffa0
commit a21db36a5b
6 changed files with 220 additions and 130 deletions
+79 -30
View File
@@ -80,6 +80,7 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
mParentLinkQuality1 = 0;
mRetrieveNewNetworkData = false;
mTimeout = kMleEndDeviceTimeout;
mReattachState = kReattachStop;
memset(&mLeaderData, 0, sizeof(mLeaderData));
memset(&mParent, 0, sizeof(mParent));
@@ -190,14 +191,14 @@ ThreadError Mle::Disable(void)
{
ThreadError error = kThreadError_None;
SuccessOrExit(error = Stop());
SuccessOrExit(error = Stop(false));
SuccessOrExit(error = mSocket.Close());
exit:
return error;
}
ThreadError Mle::Start(void)
ThreadError Mle::Start(bool aEnableReattach)
{
ThreadError error = kThreadError_None;
@@ -213,6 +214,11 @@ ThreadError Mle::Start(void)
mKeyManager.Start();
if (aEnableReattach)
{
mReattachState = kReattachStart;
}
if (GetRloc16() == Mac::kShortAddrInvalid)
{
BecomeChild(kMleAttachAnyPartition);
@@ -233,7 +239,7 @@ exit:
return error;
}
ThreadError Mle::Stop(void)
ThreadError Mle::Stop(bool aClearNetworkDatasets)
{
otLogFuncEntry();
mKeyManager.Stop();
@@ -246,6 +252,12 @@ ThreadError Mle::Stop(void)
mNetif.RemoveUnicastAddress(mLeaderAloc);
}
if (aClearNetworkDatasets)
{
mNetif.GetActiveDataset().Clear(true);
mNetif.GetPendingDataset().Clear(true);
}
mDeviceState = kDeviceStateDisabled;
otLogFuncExit();
return kThreadError_None;
@@ -343,6 +355,18 @@ ThreadError Mle::BecomeChild(otMleAttachFilter aFilter)
VerifyOrExit(mDeviceState != kDeviceStateDisabled, error = kThreadError_InvalidState);
VerifyOrExit(mParentRequestState == kParentIdle, error = kThreadError_Busy);
if (mReattachState == kReattachStart)
{
if (mNetif.GetActiveDataset().Restore() == kThreadError_None)
{
mReattachState = kReattachActive;
}
else
{
mReattachState = kReattachStop;
}
}
mParentRequestState = kParentRequestStart;
mParentRequestMode = aFilter;
memset(&mParent, 0, sizeof(mParent));
@@ -1157,37 +1181,61 @@ void Mle::HandleParentRequestTimer(void)
}
else
{
switch (mParentRequestMode)
if (mReattachState == kReattachActive)
{
case kMleAttachAnyPartition:
if (mPreviousPanId != Mac::kPanIdBroadcast)
if (mNetif.GetPendingDataset().Restore() == kThreadError_None)
{
mMac.SetChannel(mPreviousChannel);
mMac.SetPanId(mPreviousPanId);
mPreviousPanId = Mac::kPanIdBroadcast;
BecomeDetached();
mNetif.GetPendingDataset().ApplyConfiguration();
mReattachState = kReattachPending;
mParentRequestState = kParentRequestStart;
mParentRequestTimer.Start(kParentRequestRouterTimeout);
}
else if ((mDeviceMode & ModeTlv::kModeFFD) == 0)
else
{
SendOrphanAnnounce();
BecomeDetached();
mReattachState = kReattachStop;
}
else if (mMleRouter.BecomeLeader() != kThreadError_None)
}
else if (mReattachState == kReattachPending)
{
mReattachState = kReattachStop;
mNetif.GetActiveDataset().Restore();
mNetif.GetPendingDataset().Set(mNetif.GetPendingDataset().GetLocal());
}
if (mReattachState == kReattachStop)
{
switch (mParentRequestMode)
{
case kMleAttachAnyPartition:
if (mPreviousPanId != Mac::kPanIdBroadcast)
{
mMac.SetChannel(mPreviousChannel);
mMac.SetPanId(mPreviousPanId);
mPreviousPanId = Mac::kPanIdBroadcast;
BecomeDetached();
}
else if ((mDeviceMode & ModeTlv::kModeFFD) == 0)
{
SendOrphanAnnounce();
BecomeDetached();
}
else if (mMleRouter.BecomeLeader() != kThreadError_None)
{
mParentRequestState = kParentIdle;
BecomeDetached();
}
break;
case kMleAttachSamePartition:
mParentRequestState = kParentIdle;
BecomeDetached();
BecomeChild(kMleAttachAnyPartition);
break;
case kMleAttachBetterPartition:
mParentRequestState = kParentIdle;
break;
}
break;
case kMleAttachSamePartition:
mParentRequestState = kParentIdle;
BecomeChild(kMleAttachAnyPartition);
break;
case kMleAttachBetterPartition:
mParentRequestState = kParentIdle;
break;
}
}
@@ -2007,7 +2055,7 @@ ThreadError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageI
}
else
{
mNetif.GetActiveDataset().Clear();
mNetif.GetActiveDataset().Clear(false);
}
// Pending Dataset
@@ -2022,7 +2070,7 @@ ThreadError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageI
}
else
{
mNetif.GetPendingDataset().Clear();
mNetif.GetPendingDataset().Clear(false);
}
if (mPreviousPanId != Mac::kPanIdBroadcast && ((mDeviceMode & ModeTlv::kModeFFD) == 0))
@@ -2293,6 +2341,7 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
// Parent Attach Success
mParentRequestTimer.Stop();
mReattachState = kReattachStop;
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
@@ -2491,12 +2540,12 @@ ThreadError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo
mRetrieveNewNetworkData = true;
}
Stop();
Stop(false);
mPreviousChannel = mMac.GetChannel();
mPreviousPanId = mMac.GetPanId();
mMac.SetChannel(static_cast<uint8_t>(channel.GetChannel()));
mMac.SetPanId(panid.GetPanId());
Start();
Start(false);
}
else
{