From cd425ebdc1577a0564ed96e2af02a65326e124ee Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 10 Nov 2023 07:26:39 -0800 Subject: [PATCH] [multi-radio] perform tag duplication check for first fragment (#9590) This commit updates the duplicate detection mechanism for the frag header tags under `MULTI_RADIO` config. The tag check is now performed upon receiving the first fragment. For subsequent fragments, older tags are permitted to be processed, but they will be discarded if there is no matching entry in the reassembly list. This change addresses an issue where lowpan fragment frames using older tags could be erroneously discarded if they are interrupted by higher-priority messages (e.g., an MLE message). --- src/core/thread/mesh_forwarder.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 6068d011b..5fd24dd72 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -1419,31 +1419,26 @@ void MeshForwarder::HandleFragment(FrameData &aFrameData, { Neighbor *neighbor = Get().FindNeighbor(aMacAddrs.mSource, Neighbor::kInStateAnyExceptInvalid); - if (neighbor != nullptr) + if ((neighbor != nullptr) && (fragmentHeader.GetDatagramOffset() == 0)) { uint16_t tag = fragmentHeader.GetDatagramTag(); if (neighbor->IsLastRxFragmentTagSet()) { VerifyOrExit(!neighbor->IsLastRxFragmentTagAfter(tag), error = kErrorDuplicated); - - if (neighbor->GetLastRxFragmentTag() == tag) - { - VerifyOrExit(fragmentHeader.GetDatagramOffset() != 0, error = kErrorDuplicated); - - // Duplication suppression for a "next fragment" is handled - // by the code below where the the datagram offset is - // checked against the offset of the corresponding message - // (same datagram tag and size) in Reassembly List. Note - // that if there is no matching message in the Reassembly - // List (e.g., in case the message is already fully - // assembled) the received "next fragment" frame would be - // dropped. - } } neighbor->SetLastRxFragmentTag(tag); } + + // Duplication suppression for a "next fragment" is handled + // by the code below where the the datagram offset is + // checked against the offset of the corresponding message + // (same datagram tag and size) in Reassembly List. Note + // that if there is no matching message in the Reassembly + // List (e.g., in case the message is already fully + // assembled) the received "next fragment" frame would be + // dropped. } #endif // OPENTHREAD_CONFIG_MULTI_RADIO