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());
if ((mDeviceState != kDeviceStateDetached) && (mDeviceMode & ModeTlv::kModeFFD))
if (mDeviceState != kDeviceStateDetached)
{
SuccessOrExit(error = mMleRouter.HandleAdvertisement(aMessage, aMessageInfo));
}
@@ -1458,19 +1458,12 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
break;
}
if (mParent.mValid.mRloc16 != sourceAddress.GetRloc16())
if ((mParent.mValid.mRloc16 == sourceAddress.GetRloc16()) &&
(leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
leaderData.GetLeaderRouterId() != GetLeaderId()))
{
SetStateDetached();
ExitNow(error = kThreadError_NoRoute);
}
else
{
if (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
leaderData.GetLeaderRouterId() != GetLeaderId())
{
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
mRetrieveNewNetworkData = true;
}
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
mRetrieveNewNetworkData = true;
}
isNeighbor = true;
+17 -4
View File
@@ -1125,6 +1125,11 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
leaderData.GetWeighting(), peerParitionId,
mLeaderData.GetWeighting(), mLeaderData.GetPartitionId());
if ((GetDeviceState() == kDeviceStateChild) && (memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr)) == 0))
{
ExitNow();
}
if ((leaderData.GetWeighting() > mLeaderData.GetWeighting()) ||
(leaderData.GetWeighting() == mLeaderData.GetWeighting() &&
peerParitionId > mLeaderData.GetPartitionId()))
@@ -1137,8 +1142,13 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
}
else if (leaderData.GetLeaderRouterId() != GetLeaderId())
{
BecomeDetached();
ExitNow(error = kThreadError_Drop);
if (GetDeviceState() != kDeviceStateChild)
{
BecomeDetached();
error = kThreadError_Drop;
}
ExitNow();
}
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));
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);
@@ -1170,7 +1183,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
}
}
if (routerCount < mRouterUpgradeThreshold)
if ((mDeviceMode & ModeTlv::kModeFFD) && (routerCount < mRouterUpgradeThreshold))
{
BecomeRouter();
ExitNow();