diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 1821ebdfe..3dc359122 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1088,6 +1088,28 @@ otError Mle::AppendMleFrameCounter(Message &aMessage) return Tlv::Append(aMessage, Get().GetMleFrameCounter()); } +otError Mle::ReadFrameCounters(const Message &aMessage, uint32_t &aLinkFrameCounter, uint32_t &aMleFrameCounter) const +{ + otError error; + + SuccessOrExit(error = Tlv::Find(aMessage, aLinkFrameCounter)); + + switch (Tlv::Find(aMessage, aMleFrameCounter)) + { + case OT_ERROR_NONE: + break; + case OT_ERROR_NOT_FOUND: + aMleFrameCounter = aLinkFrameCounter; + break; + default: + error = OT_ERROR_PARSE; + break; + } + +exit: + return error; +} + otError Mle::AppendAddress16(Message &aMessage, uint16_t aRloc16) { return Tlv::Append(aMessage, aRloc16); @@ -3278,20 +3300,8 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo & static_cast(version))); } - // Link Frame Counter - SuccessOrExit(error = Tlv::Find(aMessage, linkFrameCounter)); - - // Mle Frame Counter - switch (Tlv::Find(aMessage, mleFrameCounter)) - { - case OT_ERROR_NONE: - break; - case OT_ERROR_NOT_FOUND: - mleFrameCounter = linkFrameCounter; - break; - default: - ExitNow(error = OT_ERROR_PARSE); - } + // Link/MLE Frame Counters + SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter)); #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE @@ -3603,18 +3613,7 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage, switch (mRole) { case kRoleDetached: - SuccessOrExit(error = Tlv::Find(aMessage, linkFrameCounter)); - - switch (Tlv::Find(aMessage, mleFrameCounter)) - { - case OT_ERROR_NONE: - break; - case OT_ERROR_NOT_FOUND: - mleFrameCounter = linkFrameCounter; - break; - default: - ExitNow(error = OT_ERROR_PARSE); - } + SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter)); mParent.SetLinkFrameCounter(linkFrameCounter); mParent.SetLinkAckFrameCounter(linkFrameCounter); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 20f1a841d..012eb00cc 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1044,6 +1044,24 @@ protected: */ otError AppendLinkFrameCounter(Message &aMessage); + /** + * This method reads Link and MLE Frame Counters from a message. + * + * Link Frame Counter TLV must be present in the message and its value is read into @p aLinkFrameCounter. If MLE + * Frame Counter TLV is present in the message, its value is read into @p aMleFrameCounter. If the MLE Frame + * Counter TLV is not present in the message, then @p aMleFrameCounter is set to same value as @p aLinkFrameCounter. + * + * @param[in] aMesssage A reference to the message to read from. + * @param[out] aLinkFrameCounter A reference to an `uint32_t` to output the Link Frame Counter. + * @param[out] aMleFrameCounter A reference to an `uint32_t` to output the MLE Frame Counter. + * + * @retval OT_ERROR_NONE Successfully read the counters. + * @retval OT_ERROR_NOT_FOUND Link Frame Counter TLV was not found in the message. + * @retval OT_ERROR_PARSE TLVs are not well-formed. + * + */ + otError ReadFrameCounters(const Message &aMessage, uint32_t &aLinkFrameCounter, uint32_t &aMleFrameCounter) const; + /** * This method appends an MLE Frame Counter TLV to a message. * diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index a5cc6cbca..8dae0756b 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -838,20 +838,8 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage, SuccessOrExit(error = Tlv::Find(aMessage, version)); VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = OT_ERROR_PARSE); - // Link-Layer Frame Counter - SuccessOrExit(error = Tlv::Find(aMessage, linkFrameCounter)); - - // MLE Frame Counter - switch (Tlv::Find(aMessage, mleFrameCounter)) - { - case OT_ERROR_NONE: - break; - case OT_ERROR_NOT_FOUND: - mleFrameCounter = linkFrameCounter; - break; - default: - ExitNow(error = OT_ERROR_PARSE); - } + // Link and MLE Frame Counters + SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter)); // Link Margin switch (Tlv::Find(aMessage, linkMargin)) @@ -2220,20 +2208,8 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage, Get().RemoveMessages(*child, Message::kSubTypeMleChildUpdateRequest); Get().RemoveMessages(*child, Message::kSubTypeMleDataResponse); - // Link-Layer Frame Counter - SuccessOrExit(error = Tlv::Find(aMessage, linkFrameCounter)); - - // MLE Frame Counter - switch (Tlv::Find(aMessage, mleFrameCounter)) - { - case OT_ERROR_NONE: - break; - case OT_ERROR_NOT_FOUND: - mleFrameCounter = linkFrameCounter; - break; - default: - ExitNow(error = OT_ERROR_PARSE); - } + // Link-Layer and MLE Frame Counters + SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter)); // Mode SuccessOrExit(error = Tlv::Find(aMessage, modeBitmask));