Refine parent information storage (#1578)

This commit is contained in:
Shu Chen
2017-04-11 20:15:27 -07:00
committed by Jonathan Hui
parent be7e27117b
commit 775eaadd60
2 changed files with 31 additions and 8 deletions
+22 -8
View File
@@ -270,6 +270,7 @@ ThreadError Mle::Restore(void)
{
ThreadError error = kThreadError_None;
NetworkInfo networkInfo;
ParentInfo parentInfo;
uint16_t length;
mNetif.GetActiveDataset().Restore();
@@ -295,10 +296,17 @@ ThreadError Mle::Restore(void)
if (networkInfo.mDeviceState == kDeviceStateChild)
{
length = sizeof(mParent);
length = sizeof(parentInfo);
SuccessOrExit(error = otPlatSettingsGet(mNetif.GetInstance(), kKeyParentInfo, 0,
reinterpret_cast<uint8_t *>(&mParent), &length));
VerifyOrExit(length == sizeof(mParent), error = kThreadError_NotFound);
reinterpret_cast<uint8_t *>(&parentInfo), &length));
VerifyOrExit(length >= sizeof(parentInfo), error = kThreadError_Parse);
memset(&mParent, 0, sizeof(mParent));
mParent.SetExtAddress(*static_cast<Mac::ExtAddress *>(&parentInfo.mExtAddress));
mParent.SetDeviceMode(ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData |
ModeTlv::kModeSecureDataRequest);
mParent.SetRloc16(GetRloc16(GetRouterId(networkInfo.mRloc16)));
mParent.SetState(Neighbor::kStateRestored);
}
else if (networkInfo.mDeviceState == kDeviceStateRouter || networkInfo.mDeviceState == kDeviceStateLeader)
{
@@ -331,6 +339,7 @@ ThreadError Mle::Store(void)
{
ThreadError error = kThreadError_None;
NetworkInfo networkInfo;
ParentInfo parentInfo;
VerifyOrExit(IsAttached(), error = kThreadError_InvalidState);
@@ -359,8 +368,11 @@ ThreadError Mle::Store(void)
if (mDeviceState == kDeviceStateChild)
{
memset(&parentInfo, 0, sizeof(parentInfo));
memcpy(&parentInfo.mExtAddress, &mParent.GetExtAddress(), sizeof(parentInfo.mExtAddress));
SuccessOrExit(error = otPlatSettingsSet(mNetif.GetInstance(), kKeyParentInfo,
reinterpret_cast<uint8_t *>(&mParent), sizeof(mParent)));
reinterpret_cast<uint8_t *>(&parentInfo), sizeof(parentInfo)));
}
SuccessOrExit(error = otPlatSettingsSet(mNetif.GetInstance(), kKeyNetworkInfo,
@@ -2643,7 +2655,8 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
mParentCandidate.SetRloc16(sourceAddress.GetRloc16());
mParentCandidate.SetLinkFrameCounter(linkFrameCounter.GetFrameCounter());
mParentCandidate.SetMleFrameCounter(mleFrameCounter.GetFrameCounter());
mParentCandidate.SetDeviceMode(ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData);
mParentCandidate.SetDeviceMode(ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData |
ModeTlv::kModeSecureDataRequest);
mParentCandidate.GetLinkInfo().Clear();
mParentCandidate.GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
mParentCandidate.ResetLinkFailures();
@@ -2918,6 +2931,7 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
mParent.SetLinkFrameCounter(linkFrameCounter.GetFrameCounter());
mParent.SetMleFrameCounter(mleFrameCounter.GetFrameCounter());
mParent.SetState(Neighbor::kStateValid);
SetStateChild(GetRloc16());
// fall through
@@ -3122,7 +3136,7 @@ exit:
Neighbor *Mle::GetNeighbor(uint16_t aAddress)
{
if ((mParent.GetState() == Neighbor::kStateValid) && (mParent.GetRloc16() == aAddress))
if ((mParent.IsStateValidOrRestoring()) && (mParent.GetRloc16() == aAddress))
{
return &mParent;
}
@@ -3137,7 +3151,7 @@ Neighbor *Mle::GetNeighbor(uint16_t aAddress)
Neighbor *Mle::GetNeighbor(const Mac::ExtAddress &aAddress)
{
if ((mParent.GetState() == Neighbor::kStateValid) &&
if ((mParent.IsStateValidOrRestoring()) &&
(memcmp(&mParent.GetExtAddress(), &aAddress, sizeof(aAddress)) == 0))
{
return &mParent;
@@ -3189,7 +3203,7 @@ bool Mle::IsAnycastLocator(const Ip6::Address &aAddress) const
Router *Mle::GetParent()
{
if ((mParent.GetState() != Neighbor::kStateValid) && (mParentCandidate.GetState() == Neighbor::kStateValid))
if ((!mParent.IsStateValidOrRestoring()) && (mParentCandidate.GetState() == Neighbor::kStateValid))
{
return &mParentCandidate;
}
+9
View File
@@ -141,6 +141,15 @@ struct NetworkInfo
uint8_t mMlIid[OT_IP6_ADDRESS_SIZE - OT_IP6_PREFIX_SIZE]; ///< IID from ML-EID
};
/**
* This structure represents the parent information for persistent storage.
*
*/
struct ParentInfo
{
Mac::ExtAddress mExtAddress; ///< Extended Address
};
/**
* This class implements MLE Header generation and parsing.
*