diff --git a/src/wifi/model/frame-exchange-manager.cc b/src/wifi/model/frame-exchange-manager.cc index cb9ab39aa..3629a1176 100644 --- a/src/wifi/model/frame-exchange-manager.cc +++ b/src/wifi/model/frame-exchange-manager.cc @@ -824,15 +824,19 @@ FrameExchangeManager::CtsTimeout (Ptr rts, const WifiTxVector& else { NS_LOG_DEBUG ("Missed CTS, retransmit RTS"); - RetransmitMpduAfterMissedCts (m_mpdu); m_dcf->UpdateFailedCw (); } + // Make the sequence number of the MPDU available again if the MPDU has never + // been transmitted, both in case the MPDU has been discarded and in case the + // MPDU has to be transmitted (because a new sequence number is assigned to + // MPDUs that have never been transmitted and are selected for transmission) + ReleaseSequenceNumber (m_mpdu); m_mpdu = 0; TransmissionFailed (); } void -FrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr mpdu) const +FrameExchangeManager::ReleaseSequenceNumber (Ptr mpdu) const { NS_LOG_FUNCTION (this << *mpdu); diff --git a/src/wifi/model/frame-exchange-manager.h b/src/wifi/model/frame-exchange-manager.h index ec5168356..1c9b5003d 100644 --- a/src/wifi/model/frame-exchange-manager.h +++ b/src/wifi/model/frame-exchange-manager.h @@ -329,11 +329,12 @@ protected: virtual void RetransmitMpduAfterMissedAck (Ptr mpdu) const; /** - * Retransmit an MPDU that was not sent because a CTS was not received. + * Make the sequence number of the given MPDU available again if the MPDU has + * never been transmitted. * - * \param mpdu the MPDU to retransmit + * \param mpdu the given MPDU */ - virtual void RetransmitMpduAfterMissedCts (Ptr mpdu) const; + virtual void ReleaseSequenceNumber (Ptr mpdu) const; /** * Pass the given MPDU, discarded because of the max retry limit was reached, diff --git a/src/wifi/model/ht/ht-frame-exchange-manager.cc b/src/wifi/model/ht/ht-frame-exchange-manager.cc index ccbecd160..d6aa73f6d 100644 --- a/src/wifi/model/ht/ht-frame-exchange-manager.cc +++ b/src/wifi/model/ht/ht-frame-exchange-manager.cc @@ -653,7 +653,7 @@ HtFrameExchangeManager::RetransmitMpduAfterMissedAck (Ptr mpdu } void -HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr mpdu) const +HtFrameExchangeManager::ReleaseSequenceNumber (Ptr mpdu) const { NS_LOG_FUNCTION (this << *mpdu); @@ -682,7 +682,7 @@ HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr mpdu return; } } - QosFrameExchangeManager::RetransmitMpduAfterMissedCts (mpdu); + QosFrameExchangeManager::ReleaseSequenceNumber (mpdu); } Time @@ -786,12 +786,16 @@ HtFrameExchangeManager::CtsTimeout (Ptr rts, const WifiTxVecto else { NS_LOG_DEBUG ("Missed CTS, retransmit MPDUs"); - for (const auto& mpdu : *PeekPointer (m_psdu)) - { - RetransmitMpduAfterMissedCts (mpdu); - } m_edca->UpdateFailedCw (); } + // Make the sequence numbers of the MPDUs available again if the MPDUs have never + // been transmitted, both in case the MPDUs have been discarded and in case the + // MPDUs have to be transmitted (because a new sequence number is assigned to + // MPDUs that have never been transmitted and are selected for transmission) + for (const auto& mpdu : *PeekPointer (m_psdu)) + { + ReleaseSequenceNumber (mpdu); + } m_psdu = 0; TransmissionFailed (); } diff --git a/src/wifi/model/ht/ht-frame-exchange-manager.h b/src/wifi/model/ht/ht-frame-exchange-manager.h index 76f8a0352..fcce481a1 100644 --- a/src/wifi/model/ht/ht-frame-exchange-manager.h +++ b/src/wifi/model/ht/ht-frame-exchange-manager.h @@ -218,7 +218,7 @@ protected: void NotifyReceivedNormalAck (Ptr mpdu) override; void NotifyPacketDiscarded (Ptr mpdu) override; void RetransmitMpduAfterMissedAck (Ptr mpdu) const override; - void RetransmitMpduAfterMissedCts (Ptr mpdu) const override; + void ReleaseSequenceNumber (Ptr mpdu) const override; void ForwardMpduDown (Ptr mpdu, WifiTxVector& txVector) override; void CtsTimeout (Ptr rts, const WifiTxVector& txVector) override; void TransmissionSucceeded (void) override;