wifi: Release sequence numbers of MPDUs dropped after CTS timeout
...if MPDUs have never been transmitted
This commit is contained in:
@@ -824,15 +824,19 @@ FrameExchangeManager::CtsTimeout (Ptr<WifiMacQueueItem> 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<WifiMacQueueItem> mpdu) const
|
||||
FrameExchangeManager::ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this << *mpdu);
|
||||
|
||||
|
||||
@@ -329,11 +329,12 @@ protected:
|
||||
virtual void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> 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<WifiMacQueueItem> mpdu) const;
|
||||
virtual void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const;
|
||||
|
||||
/**
|
||||
* Pass the given MPDU, discarded because of the max retry limit was reached,
|
||||
|
||||
@@ -653,7 +653,7 @@ HtFrameExchangeManager::RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu
|
||||
}
|
||||
|
||||
void
|
||||
HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const
|
||||
HtFrameExchangeManager::ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this << *mpdu);
|
||||
|
||||
@@ -682,7 +682,7 @@ HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu
|
||||
return;
|
||||
}
|
||||
}
|
||||
QosFrameExchangeManager::RetransmitMpduAfterMissedCts (mpdu);
|
||||
QosFrameExchangeManager::ReleaseSequenceNumber (mpdu);
|
||||
}
|
||||
|
||||
Time
|
||||
@@ -786,12 +786,16 @@ HtFrameExchangeManager::CtsTimeout (Ptr<WifiMacQueueItem> 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 ();
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ protected:
|
||||
void NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu) override;
|
||||
void NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu) override;
|
||||
void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const override;
|
||||
void RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const override;
|
||||
void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const override;
|
||||
void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector) override;
|
||||
void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
|
||||
void TransmissionSucceeded (void) override;
|
||||
|
||||
Reference in New Issue
Block a user