[mle] don't send unnecessary MLE Link Request (#2190)

This commit is contained in:
Shu Chen
2017-09-14 18:34:37 -07:00
committed by Jonathan Hui
parent 643eed78bd
commit 1c02bc79b7
2 changed files with 12 additions and 2 deletions
+1
View File
@@ -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)
};
+11 -2
View File
@@ -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)
{