mirror of
https://github.com/espressif/openthread.git
synced 2026-08-29 13:29:54 +00:00
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:
+6
-13
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user