REEDs or rx-on-when-idle End Devices should attempt to maintain one-way synchronization with neighboring routers (#222)

from which incoming MLE advertisments are from
This commit is contained in:
rongli
2016-07-04 12:50:49 -07:00
committed by Jonathan Hui
parent 0abde2e2cc
commit 59af30249d
2 changed files with 23 additions and 17 deletions
+6 -13
View File
@@ -1437,7 +1437,7 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
otLogInfoMle("Received advertisement from %04x\n", sourceAddress.GetRloc16()); otLogInfoMle("Received advertisement from %04x\n", sourceAddress.GetRloc16());
if ((mDeviceState != kDeviceStateDetached) && (mDeviceMode & ModeTlv::kModeFFD)) if (mDeviceState != kDeviceStateDetached)
{ {
SuccessOrExit(error = mMleRouter.HandleAdvertisement(aMessage, aMessageInfo)); SuccessOrExit(error = mMleRouter.HandleAdvertisement(aMessage, aMessageInfo));
} }
@@ -1458,19 +1458,12 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
break; break;
} }
if (mParent.mValid.mRloc16 != sourceAddress.GetRloc16()) if ((mParent.mValid.mRloc16 == sourceAddress.GetRloc16()) &&
(leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
leaderData.GetLeaderRouterId() != GetLeaderId()))
{ {
SetStateDetached(); SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
ExitNow(error = kThreadError_NoRoute); mRetrieveNewNetworkData = true;
}
else
{
if (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
leaderData.GetLeaderRouterId() != GetLeaderId())
{
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
mRetrieveNewNetworkData = true;
}
} }
isNeighbor = true; isNeighbor = true;
+17 -4
View File
@@ -1125,6 +1125,11 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
leaderData.GetWeighting(), peerParitionId, leaderData.GetWeighting(), peerParitionId,
mLeaderData.GetWeighting(), mLeaderData.GetPartitionId()); mLeaderData.GetWeighting(), mLeaderData.GetPartitionId());
if ((GetDeviceState() == kDeviceStateChild) && (memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr)) == 0))
{
ExitNow();
}
if ((leaderData.GetWeighting() > mLeaderData.GetWeighting()) || if ((leaderData.GetWeighting() > mLeaderData.GetWeighting()) ||
(leaderData.GetWeighting() == mLeaderData.GetWeighting() && (leaderData.GetWeighting() == mLeaderData.GetWeighting() &&
peerParitionId > mLeaderData.GetPartitionId())) peerParitionId > mLeaderData.GetPartitionId()))
@@ -1137,8 +1142,13 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
} }
else if (leaderData.GetLeaderRouterId() != GetLeaderId()) else if (leaderData.GetLeaderRouterId() != GetLeaderId())
{ {
BecomeDetached(); if (GetDeviceState() != kDeviceStateChild)
ExitNow(error = kThreadError_Drop); {
BecomeDetached();
error = kThreadError_Drop;
}
ExitNow();
} }
VerifyOrExit(GetChildId(sourceAddress.GetRloc16()) == 0, ;); VerifyOrExit(GetChildId(sourceAddress.GetRloc16()) == 0, ;);
@@ -1147,7 +1157,10 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route)); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route));
VerifyOrExit(route.IsValid(), error = kThreadError_Parse); VerifyOrExit(route.IsValid(), error = kThreadError_Parse);
SuccessOrExit(error = ProcessRouteTlv(route)); if (mDeviceMode & ModeTlv::kModeFFD)
{
SuccessOrExit(error = ProcessRouteTlv(route));
}
VerifyOrExit((routerId = GetRouterId(sourceAddress.GetRloc16())) < kMaxRouterId, error = kThreadError_Parse); VerifyOrExit((routerId = GetRouterId(sourceAddress.GetRloc16())) < kMaxRouterId, error = kThreadError_Parse);
@@ -1170,7 +1183,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
} }
} }
if (routerCount < mRouterUpgradeThreshold) if ((mDeviceMode & ModeTlv::kModeFFD) && (routerCount < mRouterUpgradeThreshold))
{ {
BecomeRouter(); BecomeRouter();
ExitNow(); ExitNow();