From ef58caf19b56ba79241865db8b1b195088977c70 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Thu, 8 Dec 2016 10:21:26 -0800 Subject: [PATCH] Fix cleanup of indirect messages when a child is removed. (#1052) - Allow cleanup even when mSendBusy is true. - Set mSendMessage to NULL to indicate that the message has been freed. - In HandleSentFrame(), simply schedule next transmission if mSendMessage is NULL. --- src/core/thread/mesh_forwarder.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index d67f74a56..73ff716b4 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -187,8 +187,6 @@ void MeshForwarder::UpdateIndirectMessages(void) Child *children; uint8_t numChildren; - VerifyOrExit(mSendBusy == false,); - children = mMle.GetChildren(&numChildren); for (uint8_t i = 0; i < numChildren; i++) @@ -209,6 +207,11 @@ void MeshForwarder::UpdateIndirectMessages(void) if (!message->IsChildPending()) { + if (mSendMessage == message) + { + mSendMessage = NULL; + } + mSendQueue.Dequeue(*message); message->Free(); } @@ -217,9 +220,6 @@ void MeshForwarder::UpdateIndirectMessages(void) child->mQueuedIndirectMessageCnt = 0; ClearSrcMatchEntry(*child); } - -exit: - return; } void MeshForwarder::ScheduleTransmissionTask() @@ -1255,7 +1255,12 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) Neighbor *neighbor; mSendBusy = false; - VerifyOrExit(mSendMessage != NULL, ;); + + if (mSendMessage == NULL) + { + mScheduleTransmissionTask.Post(); + ExitNow(); + } aFrame.GetDstAddr(macDest);