mirror of
https://github.com/espressif/openthread.git
synced 2026-10-01 21:37:39 +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());
|
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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user