[mle] add RemoveDelayedMessage() helper method (#7476)

This commit adds `Mle::RemoveDelayedMessage()` helper method which
removes messages with a given sub-type and an optional destination
IPv6 address from the `mDelayedResponses` message queue.
This commit is contained in:
Abtin Keshavarzian
2022-03-14 10:52:54 -07:00
committed by GitHub
parent fc523bc0d9
commit ea28a1913b
2 changed files with 16 additions and 25 deletions
+14 -24
View File
@@ -2020,41 +2020,31 @@ exit:
void Mle::RemoveDelayedDataResponseMessage(void)
{
Message * message = mDelayedResponses.GetHead();
DelayedResponseMetadata metadata;
while (message != nullptr)
{
metadata.ReadFrom(*message);
if (message->GetSubType() == Message::kSubTypeMleDataResponse)
{
mDelayedResponses.DequeueAndFree(*message);
Log(kMessageRemoveDelayed, kTypeDataResponse, metadata.mDestination);
// no more than one multicast MLE Data Response in Delayed Message Queue.
break;
}
message = message->GetNext();
}
RemoveDelayedMessage(Message::kSubTypeMleDataResponse, kTypeDataResponse, nullptr);
}
void Mle::RemoveDelayedDataRequestMessage(const Ip6::Address &aDestination)
{
for (Message *message = mDelayedResponses.GetHead(); message != nullptr; message = message->GetNext())
RemoveDelayedMessage(Message::kSubTypeMleDataRequest, kTypeDataRequest, &aDestination);
}
void Mle::RemoveDelayedMessage(Message::SubType aSubType, MessageType aMessageType, const Ip6::Address *aDestination)
{
Message *nextMessage;
for (Message *message = mDelayedResponses.GetHead(); message != nullptr; message = nextMessage)
{
DelayedResponseMetadata metadata;
nextMessage = message->GetNext();
metadata.ReadFrom(*message);
if (message->GetSubType() == Message::kSubTypeMleDataRequest && metadata.mDestination == aDestination)
if ((message->GetSubType() == aSubType) &&
((aDestination == nullptr) || (metadata.mDestination == *aDestination)))
{
mDelayedResponses.DequeueAndFree(*message);
Log(kMessageRemoveDelayed, kTypeDataRequest, metadata.mDestination);
// no more than one MLE Data Request for the destination in Delayed Message Queue.
break;
Log(kMessageRemoveDelayed, aMessageType, metadata.mDestination);
}
}
}
+2 -1
View File
@@ -1832,7 +1832,8 @@ private:
bool PrepareAnnounceState(void);
void SendAnnounce(uint8_t aChannel, AnnounceMode aMode);
void SendAnnounce(uint8_t aChannel, const Ip6::Address &aDestination, AnnounceMode aMode = kNormalAnnounce);
void RemoveDelayedDataRequestMessage(const Ip6::Address &aDestination);
void RemoveDelayedMessage(Message::SubType aSubType, MessageType aMessageType, const Ip6::Address *aDestination);
void RemoveDelayedDataRequestMessage(const Ip6::Address &aDestination);
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
Error SendLinkMetricsManagementResponse(const Ip6::Address &aDestination, LinkMetrics::Status aStatus);
#endif