diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index e606d7573..ff9bfb07c 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -2697,6 +2697,8 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M StatusTlv status; ModeTlv mode; ResponseTlv response; + LinkFrameCounterTlv linkFrameCounter; + MleFrameCounterTlv mleFrameCounter; LeaderDataTlv leaderData; SourceAddressTlv sourceAddress; TimeoutTlv timeout; @@ -2727,6 +2729,23 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M sizeof(mParentRequest.mChallenge)) == 0, error = kThreadError_Drop); + SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkFrameCounter, sizeof(linkFrameCounter), + linkFrameCounter)); + VerifyOrExit(linkFrameCounter.IsValid(), error = kThreadError_Parse); + + if (Tlv::GetTlv(aMessage, Tlv::kMleFrameCounter, sizeof(mleFrameCounter), mleFrameCounter) == + kThreadError_None) + { + VerifyOrExit(mleFrameCounter.IsValid(), error = kThreadError_Parse); + } + else + { + mleFrameCounter.SetFrameCounter(linkFrameCounter.GetFrameCounter()); + } + + mParent.mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); + mParent.mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); + SetStateChild(GetRloc16()); // fall through