[mle] remove redundant GetNeighbor calls in MleRouter::HandleLinkReqest (#4297)

This commit is contained in:
Jonathan Hui
2019-11-06 07:02:19 -08:00
parent 9bcef319bb
commit 7703bad23f
4 changed files with 14 additions and 19 deletions
+1 -1
View File
@@ -2762,7 +2762,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
switch (command)
{
case Header::kCommandLinkRequest:
Get<MleRouter>().HandleLinkRequest(aMessage, aMessageInfo);
Get<MleRouter>().HandleLinkRequest(aMessage, aMessageInfo, neighbor);
break;
case Header::kCommandLinkAccept:
+11 -16
View File
@@ -557,17 +557,15 @@ exit:
return error;
}
otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
{
otError error = OT_ERROR_NONE;
Neighbor * neighbor = NULL;
Mac::ExtAddress macAddr;
ChallengeTlv challenge;
VersionTlv version;
LeaderDataTlv leaderData;
SourceAddressTlv sourceAddress;
TlvRequestTlv tlvRequest;
uint16_t rloc16;
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
TimeRequestTlv timeRequest;
#endif
@@ -578,8 +576,6 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
VerifyOrExit(mAttachState == kAttachStateIdle, error = OT_ERROR_INVALID_STATE);
aMessageInfo.GetPeerAddr().ToExtAddress(macAddr);
// Challenge
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kChallenge, sizeof(challenge), challenge));
VerifyOrExit(challenge.IsValid(), error = OT_ERROR_PARSE);
@@ -598,20 +594,24 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
// Source Address
if (Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress) == OT_ERROR_NONE)
{
uint16_t rloc16;
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
rloc16 = sourceAddress.GetRloc16();
if ((neighbor = GetNeighbor(macAddr)) != NULL && neighbor->GetRloc16() != rloc16)
if (aNeighbor && aNeighbor->IsStateValid() && aNeighbor->GetRloc16() != rloc16)
{
// remove stale neighbors
RemoveNeighbor(*neighbor);
neighbor = NULL;
RemoveNeighbor(*aNeighbor);
}
if (IsActiveRouter(rloc16))
{
// source is a router
Mac::ExtAddress macAddr;
aMessageInfo.GetPeerAddr().ToExtAddress(macAddr);
neighbor = mRouterTable.GetRouter(GetRouterId(rloc16));
VerifyOrExit(neighbor != NULL, error = OT_ERROR_PARSE);
VerifyOrExit(!neighbor->IsStateLinkRequest(), error = OT_ERROR_ALREADY);
@@ -632,18 +632,13 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
VerifyOrExit(neighbor->GetExtAddress() == macAddr);
}
}
else
{
// source is not a router
neighbor = NULL;
}
}
else
{
// lack of source address indicates router coming out of reset
VerifyOrExit((neighbor = GetNeighbor(macAddr)) != NULL && neighbor->IsStateValid() &&
IsActiveRouter(neighbor->GetRloc16()),
VerifyOrExit(aNeighbor && aNeighbor->IsStateValid() && IsActiveRouter(aNeighbor->GetRloc16()),
error = OT_ERROR_DROP);
neighbor = aNeighbor;
}
// TLV Request
+1 -1
View File
@@ -674,7 +674,7 @@ private:
otError RefreshStoredChildren(void);
void HandleDetachStart(void);
otError HandleChildStart(AttachMode aMode);
otError HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
otError HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor);
otError HandleLinkAccept(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, uint32_t aKeySequence);
otError HandleLinkAccept(const Message & aMessage,
const Ip6::MessageInfo &aMessageInfo,
+1 -1
View File
@@ -129,7 +129,7 @@ public:
private:
void HandleDetachStart(void) {}
otError HandleChildStart(AttachMode) { return OT_ERROR_NONE; }
otError HandleLinkRequest(const Message &, const Ip6::MessageInfo &) { return OT_ERROR_DROP; }
otError HandleLinkRequest(const Message &, const Ip6::MessageInfo &, Neighbor *) { return OT_ERROR_DROP; }
otError HandleLinkAccept(const Message &, const Ip6::MessageInfo &, uint32_t) { return OT_ERROR_DROP; }
otError HandleLinkAccept(const Message &, const Ip6::MessageInfo &, uint32_t, bool) { return OT_ERROR_DROP; }
otError HandleLinkAcceptAndRequest(const Message &, const Ip6::MessageInfo &, uint32_t) { return OT_ERROR_DROP; }