From 66eb5aae97c0577d4b4edecf2e0b0d4e85f38cb4 Mon Sep 17 00:00:00 2001 From: rongli Date: Sat, 25 Feb 2017 01:19:47 +0800 Subject: [PATCH] No Child Update Response for timed-out sleepy child (#1387) --- src/core/thread/mle_router.cpp | 37 ++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index feb0bddec..c10add242 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -2197,27 +2197,34 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I otLogInfoMle("Received Child Update Request from child"); - // Find Child - macAddr.Set(aMessageInfo.GetPeerAddr()); - - child = FindChild(macAddr); - - if ((child == NULL) || (child->mState != Neighbor::kStateValid)) - { - tlvs[tlvslength++] = Tlv::kStatus; - SendChildUpdateResponse(NULL, aMessageInfo, tlvs, tlvslength, NULL); - ExitNow(); - } - - tlvs[tlvslength++] = Tlv::kSourceAddress; - tlvs[tlvslength++] = Tlv::kLeaderData; - // Mode SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kMode, sizeof(mode), mode)); VerifyOrExit(mode.IsValid(), error = kThreadError_Parse); + + // Find Child + macAddr.Set(aMessageInfo.GetPeerAddr()); + child = FindChild(macAddr); + + tlvs[tlvslength++] = Tlv::kSourceAddress; + + if ((child == NULL) || (child->mState != Neighbor::kStateValid)) + { + // Send Child Update Response with status TLV(error) for invalid non-sleepy child + // No Child Update Response for invalid sleepy child + if (mode.GetMode() & ModeTlv::kModeRxOnWhenIdle) + { + tlvs[tlvslength++] = Tlv::kStatus; + SendChildUpdateResponse(NULL, aMessageInfo, tlvs, tlvslength, NULL); + } + + ExitNow(); + } + child->mMode = mode.GetMode(); tlvs[tlvslength++] = Tlv::kMode; + tlvs[tlvslength++] = Tlv::kLeaderData; + // Challenge if (Tlv::GetTlv(aMessage, Tlv::kChallenge, sizeof(challenge), challenge) == kThreadError_None) {