From ea28a1913bc6a1f8e04d7e504b824c6ba8fc8806 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 14 Mar 2022 10:52:54 -0700 Subject: [PATCH] [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. --- src/core/thread/mle.cpp | 38 ++++++++++++++------------------------ src/core/thread/mle.hpp | 3 ++- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index d8bbafc26..829facfdf 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -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); } } } diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 39f1ec7bb..90617ba5b 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -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