From 59af30249d95707af6725d3540aed3b2fc6b4e2e Mon Sep 17 00:00:00 2001 From: rongli Date: Tue, 5 Jul 2016 03:50:49 +0800 Subject: [PATCH] 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 --- src/core/thread/mle.cpp | 19 ++++++------------- src/core/thread/mle_router.cpp | 21 +++++++++++++++++---- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index cb1c2495c..1b5b84eb8 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -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; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 4b487bfbc..7112b53ff 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -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();