From 5ac1fbeadebc7ad84f29d40f2c1ffd67e31a1df3 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 12 Oct 2020 21:25:15 -0700 Subject: [PATCH] [indirect-sender] remove existing supervision msg on new msg add (#5638) --- src/core/thread/indirect_sender.cpp | 32 +++++++++++++---------------- src/core/thread/indirect_sender.hpp | 2 +- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/core/thread/indirect_sender.cpp b/src/core/thread/indirect_sender.cpp index 6bf15b3e6..6e7df3774 100644 --- a/src/core/thread/indirect_sender.cpp +++ b/src/core/thread/indirect_sender.cpp @@ -102,6 +102,16 @@ void IndirectSender::AddMessageForSleepyChild(Message &aMessage, Child &aChild) aMessage.SetChildMask(childIndex); mSourceMatchController.IncrementMessageCount(aChild); + if ((aMessage.GetType() != Message::kTypeSupervision) && (aChild.GetIndirectMessageCount() > 1)) + { + Message *supervisionMessage = FindIndirectMessage(aChild, /* aSupervisionTypeOnly */ true); + + if (supervisionMessage != nullptr) + { + IgnoreError(RemoveMessageFromSleepyChild(*supervisionMessage, aChild)); + } + } + RequestMessageUpdate(aChild); exit: @@ -211,30 +221,16 @@ void IndirectSender::HandleChildModeChange(Child &aChild, Mle::DeviceMode aOldMo // case. } -Message *IndirectSender::FindIndirectMessage(Child &aChild) +Message *IndirectSender::FindIndirectMessage(Child &aChild, bool aSupervisionTypeOnly) { Message *message; - Message *next; uint16_t childIndex = Get().GetChildIndex(aChild); - for (message = Get().mSendQueue.GetHead(); message; message = next) + for (message = Get().mSendQueue.GetHead(); message; message = message->GetNext()) { - next = message->GetNext(); - - if (message->GetChildMask(childIndex)) + if (message->GetChildMask(childIndex) && + (!aSupervisionTypeOnly || (message->GetType() == Message::kTypeSupervision))) { - // Skip and remove the supervision message if there are - // other messages queued for the child. - - if ((message->GetType() == Message::kTypeSupervision) && (aChild.GetIndirectMessageCount() > 1)) - { - message->ClearChildMask(childIndex); - mSourceMatchController.DecrementMessageCount(aChild); - Get().mSendQueue.Dequeue(*message); - message->Free(); - continue; - } - break; } } diff --git a/src/core/thread/indirect_sender.hpp b/src/core/thread/indirect_sender.hpp index db2a01896..b118ff16d 100644 --- a/src/core/thread/indirect_sender.hpp +++ b/src/core/thread/indirect_sender.hpp @@ -218,7 +218,7 @@ private: void HandleFrameChangeDone(Child &aChild); void UpdateIndirectMessage(Child &aChild); - Message *FindIndirectMessage(Child &aChild); + Message *FindIndirectMessage(Child &aChild, bool aSupervisionTypeOnly = false); void RequestMessageUpdate(Child &aChild); uint16_t PrepareDataFrame(Mac::TxFrame &aFrame, Child &aChild, Message &aMessage); void PrepareEmptyFrame(Mac::TxFrame &aFrame, Child &aChild, bool aAckRequest);