From 56354634b95bc1c3e49511b924f697179bfe5bb6 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Wed, 16 Oct 2019 14:46:09 -0700 Subject: [PATCH] [mle] clean up Mle::HandleAdvertisement neighbor handling (#4297) Avoid redudnant search for neighbor entries. --- src/core/thread/mle.cpp | 44 +++++++++++------------------------------ src/core/thread/mle.hpp | 2 +- 2 files changed, 12 insertions(+), 34 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 50fdb0259..f05dfeaf3 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -2766,7 +2766,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn break; case Header::kCommandAdvertisement: - HandleAdvertisement(aMessage, aMessageInfo); + HandleAdvertisement(aMessage, aMessageInfo, neighbor); break; case Header::kCommandDataRequest: @@ -2832,12 +2832,9 @@ exit: return; } -otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo) +otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor) { otError error = OT_ERROR_NONE; - Mac::ExtAddress macAddr; - bool isNeighbor; - Neighbor * neighbor; SourceAddressTlv sourceAddress; LeaderDataTlv leaderData; RouteTlv route; @@ -2854,38 +2851,27 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData)); VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE); - aMessageInfo.GetPeerAddr().ToExtAddress(macAddr); - if (mRole != OT_DEVICE_ROLE_DETACHED) { if (IsFullThreadDevice()) { SuccessOrExit(error = Get().HandleAdvertisement(aMessage, aMessageInfo)); } - else + else if ((aNeighbor == &mParent) && (mParent.GetRloc16() != sourceAddress.GetRloc16())) { // Remove stale parent. - if (GetNeighbor(macAddr) == static_cast(&mParent) && - mParent.GetRloc16() != sourceAddress.GetRloc16()) - { - BecomeDetached(); - } + BecomeDetached(); } } - isNeighbor = false; - switch (mRole) { case OT_DEVICE_ROLE_DISABLED: case OT_DEVICE_ROLE_DETACHED: - break; + ExitNow(); case OT_DEVICE_ROLE_CHILD: - if (mParent.GetExtAddress() != macAddr) - { - break; - } + VerifyOrExit(aNeighbor == &mParent); if ((mParent.GetRloc16() == sourceAddress.GetRloc16()) && (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() || @@ -2903,28 +2889,20 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo mRetrieveNewNetworkData = true; } - isNeighbor = true; mParent.SetLastHeard(TimerMilli::GetNow()); break; case OT_DEVICE_ROLE_ROUTER: case OT_DEVICE_ROLE_LEADER: - if ((neighbor = Get().GetNeighbor(macAddr)) != NULL && neighbor->IsStateValid()) - { - isNeighbor = true; - } - + VerifyOrExit(aNeighbor && aNeighbor->IsStateValid()); break; } - if (isNeighbor) + if (mRetrieveNewNetworkData || + (static_cast(leaderData.GetDataVersion() - Get().GetVersion()) > 0)) { - if (mRetrieveNewNetworkData || - (static_cast(leaderData.GetDataVersion() - Get().GetVersion()) > 0)) - { - delay = Random::NonCrypto::GetUint16InRange(0, kMleMaxResponseDelay); - SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay); - } + delay = Random::NonCrypto::GetUint16InRange(0, kMleMaxResponseDelay); + SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay); } exit: diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 7ab63742a..02cb1d6db 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1706,7 +1706,7 @@ private: void HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); void ScheduleMessageTransmissionTimer(void); - otError HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + otError HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor); otError HandleChildIdResponse(const Message & aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor * aNeighbor);