[indirect-sender] remove existing supervision msg on new msg add (#5638)

This commit is contained in:
Abtin Keshavarzian
2020-10-12 21:25:15 -07:00
committed by GitHub
parent ee6ffd7e10
commit 5ac1fbeade
2 changed files with 15 additions and 19 deletions
+14 -18
View File
@@ -102,6 +102,16 @@ void IndirectSender::AddMessageForSleepyChild(Message &aMessage, Child &aChild)
aMessage.SetChildMask(childIndex); aMessage.SetChildMask(childIndex);
mSourceMatchController.IncrementMessageCount(aChild); 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); RequestMessageUpdate(aChild);
exit: exit:
@@ -211,30 +221,16 @@ void IndirectSender::HandleChildModeChange(Child &aChild, Mle::DeviceMode aOldMo
// case. // case.
} }
Message *IndirectSender::FindIndirectMessage(Child &aChild) Message *IndirectSender::FindIndirectMessage(Child &aChild, bool aSupervisionTypeOnly)
{ {
Message *message; Message *message;
Message *next;
uint16_t childIndex = Get<ChildTable>().GetChildIndex(aChild); uint16_t childIndex = Get<ChildTable>().GetChildIndex(aChild);
for (message = Get<MeshForwarder>().mSendQueue.GetHead(); message; message = next) for (message = Get<MeshForwarder>().mSendQueue.GetHead(); message; message = message->GetNext())
{ {
next = message->GetNext(); if (message->GetChildMask(childIndex) &&
(!aSupervisionTypeOnly || (message->GetType() == Message::kTypeSupervision)))
if (message->GetChildMask(childIndex))
{ {
// 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<MeshForwarder>().mSendQueue.Dequeue(*message);
message->Free();
continue;
}
break; break;
} }
} }
+1 -1
View File
@@ -218,7 +218,7 @@ private:
void HandleFrameChangeDone(Child &aChild); void HandleFrameChangeDone(Child &aChild);
void UpdateIndirectMessage(Child &aChild); void UpdateIndirectMessage(Child &aChild);
Message *FindIndirectMessage(Child &aChild); Message *FindIndirectMessage(Child &aChild, bool aSupervisionTypeOnly = false);
void RequestMessageUpdate(Child &aChild); void RequestMessageUpdate(Child &aChild);
uint16_t PrepareDataFrame(Mac::TxFrame &aFrame, Child &aChild, Message &aMessage); uint16_t PrepareDataFrame(Mac::TxFrame &aFrame, Child &aChild, Message &aMessage);
void PrepareEmptyFrame(Mac::TxFrame &aFrame, Child &aChild, bool aAckRequest); void PrepareEmptyFrame(Mac::TxFrame &aFrame, Child &aChild, bool aAckRequest);