From 1c02bc79b71b030b242476e72c4cbbe24190bc48 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Fri, 15 Sep 2017 09:34:37 +0800 Subject: [PATCH] [mle] don't send unnecessary MLE Link Request (#2190) --- src/core/thread/mle_constants.hpp | 1 + src/core/thread/mle_router.cpp | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/thread/mle_constants.hpp b/src/core/thread/mle_constants.hpp index b374a2ac9..07ae29e34 100644 --- a/src/core/thread/mle_constants.hpp +++ b/src/core/thread/mle_constants.hpp @@ -65,6 +65,7 @@ enum kMaxResponseDelay = 1000, ///< Maximum delay before responding to a multicast request kMaxChildIdRequestTimeout = 5000, ///< Maximum delay for receiving a Child ID Request kMaxChildUpdateResponseTimeout = 2000, ///< Maximum delay for receiving a Child Update Response + kMaxLinkRequestTimeout = 2000, ///< Maximum delay for receiving a Link Accept kMinTimeout = (((kMaxChildKeepAliveAttempts + 1) * kUnicastRetransmissionDelay) / 1000), ///< Minimum timeout(s) }; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index e270d0b0a..7cb3b92fc 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -712,6 +712,7 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message // source is a router neighbor = GetRouter(GetRouterId(rloc16)); VerifyOrExit(neighbor != NULL, error = OT_ERROR_PARSE); + VerifyOrExit(neighbor->GetState() != Neighbor::kStateLinkRequest, error = OT_ERROR_ALREADY); if (neighbor->GetState() != Neighbor::kStateValid) { @@ -1433,7 +1434,8 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa } } } - else if ((mDeviceMode & ModeTlv::kModeFFD) && (router->GetState() != Neighbor::kStateValid)) + else if ((mDeviceMode & ModeTlv::kModeFFD) && (router->GetState() != Neighbor::kStateValid) && + (router->GetState() != Neighbor::kStateLinkRequest)) { router->SetExtAddress(macAddr); router->GetLinkInfo().Clear(); @@ -1480,7 +1482,7 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa } // Send link request if no link to router - if (router->GetState() != Neighbor::kStateValid) + if ((router->GetState() != Neighbor::kStateValid) && (router->GetState() != Neighbor::kStateLinkRequest)) { router->SetExtAddress(macAddr); router->GetLinkInfo().Clear(); @@ -1865,6 +1867,13 @@ void MleRouter::HandleStateUpdateTimer(void) RemoveNeighbor(mRouters[i]); } } + else if (mRouters[i].GetState() == Neighbor::kStateLinkRequest) + { + if ((TimerMilli::GetNow() - mRouters[i].GetLastHeard()) >= kMaxLinkRequestTimeout) + { + RemoveNeighbor(mRouters[i]); + } + } if (mRole == OT_DEVICE_ROLE_LEADER) {