diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 52388bb15..048322448 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -808,7 +808,6 @@ Mac::TxFrame *MeshForwarder::HandleFrameRequest(Mac::TxFrames &aTxFrames) mMessageNextOffset = mSendMessage->GetLength(); ExitNow(frame = nullptr); } - break; #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE @@ -1308,18 +1307,7 @@ void MeshForwarder::UpdateSendMessage(Error aFrameTxError, Mac::Address &aMacDes break; case Message::kSubTypeMleChildIdRequest: - if (mSendMessage->IsLinkSecurityEnabled()) - { - // If the Child ID Request requires fragmentation and therefore - // link layer security, the frame transmission will be aborted. - // When the message is being freed, we signal to MLE to prepare a - // shorter Child ID Request message (by only including mesh-local - // address in the Address Registration TLV). - - LogInfo("Requesting shorter `Child ID Request`"); - Get().RequestShorterChildIdRequest(); - } - + Get().HandleChildIdRequestTxDone(*mSendMessage); break; default: diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index d8b1ad8b5..d4bdbc10f 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1776,6 +1776,27 @@ void Mle::RequestShorterChildIdRequest(void) } } +void Mle::HandleChildIdRequestTxDone(Message &aMessage) +{ + if (aMessage.GetTxSuccess() && !IsRxOnWhenIdle()) + { + Get().SetAttachMode(true); + Get().SetRxOnWhenIdle(false); + } + + if (aMessage.IsLinkSecurityEnabled()) + { + // If the Child ID Request requires fragmentation and therefore + // link layer security, the frame transmission will be aborted. + // When the message is being freed, we signal to MLE to prepare a + // shorter Child ID Request message (by only including mesh-local + // address in the Address Registration TLV). + + LogInfo("Requesting shorter `Child ID Request`"); + RequestShorterChildIdRequest(); + } +} + Error Mle::SendChildIdRequest(void) { static const uint8_t kTlvs[] = {Tlv::kAddress16, Tlv::kNetworkData, Tlv::kRoute}; @@ -1832,13 +1853,6 @@ Error Mle::SendChildIdRequest(void) Log(kMessageSend, (mAddressRegistrationMode == kAppendMeshLocalOnly) ? kTypeChildIdRequestShort : kTypeChildIdRequest, destination); - - if (!IsRxOnWhenIdle()) - { - Get().SetAttachMode(true); - Get().SetRxOnWhenIdle(false); - } - exit: FreeMessageOnError(message, error); return error; diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 9d4149909..1ca1645ec 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -644,6 +644,13 @@ public: mParentResponseCallback.Set(aCallback, aContext); } #endif + /** + * Notifies MLE whether the Child ID Request message was transmitted successfully. + * + * @param[in] aMessage The transmitted message. + * + */ + void HandleChildIdRequestTxDone(Message &aMessage); /** * Requests MLE layer to prepare and send a shorter version of Child ID Request message by only