diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index d4e61cf08..413321c28 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -1320,8 +1320,10 @@ exit: mScheduleTransmissionTask.Post(); } -void MeshForwarder::RemoveMessageIfNoPendingTx(Message &aMessage) +bool MeshForwarder::RemoveMessageIfNoPendingTx(Message &aMessage) { + bool didRemove = false; + #if OPENTHREAD_FTD VerifyOrExit(!aMessage.IsDirectTransmission() && !aMessage.IsChildPending()); #else @@ -1335,9 +1337,10 @@ void MeshForwarder::RemoveMessageIfNoPendingTx(Message &aMessage) } mSendQueue.DequeueAndFree(aMessage); + didRemove = true; exit: - return; + return didRemove; } void MeshForwarder::HandleReceivedFrame(Mac::RxFrame &aFrame) diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index ffa8af2c4..dfdc749fd 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -567,7 +567,7 @@ private: void UpdateNeighborLinkFailures(Neighbor &aNeighbor, Error aError, bool aAllowNeighborRemove, uint8_t aFailLimit); void HandleSentFrame(Mac::TxFrame &aFrame, Error aError); void UpdateSendMessage(Error aFrameTxError, Mac::Address &aMacDest, Neighbor *aNeighbor); - void RemoveMessageIfNoPendingTx(Message &aMessage); + bool RemoveMessageIfNoPendingTx(Message &aMessage); void HandleTimeTick(void); void ScheduleTransmissionTask(void); diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index 5e84f4c0e..16eea50bc 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -135,12 +135,21 @@ Error MeshForwarder::SendMessage(Message &aMessage) break; } + // Ensure that the message is marked for direct tx and/or for indirect tx + // to a sleepy child. Otherwise, remove the message. + + if (RemoveMessageIfNoPendingTx(aMessage)) + { + ExitNow(); + } + #if (OPENTHREAD_CONFIG_MAX_FRAMES_IN_DIRECT_TX_QUEUE > 0) ApplyDirectTxQueueLimit(aMessage); #endif mScheduleTransmissionTask.Post(); +exit: return error; }