wifi: Release sequence numbers of MPDUs dropped after CTS timeout

...if MPDUs have never been transmitted
This commit is contained in:
Stefano Avallone
2022-03-15 23:38:50 +01:00
parent 815942a5cc
commit a8ed77f66f
4 changed files with 21 additions and 12 deletions

View File

@@ -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);

View File

@@ -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,

View File

@@ -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 ();
}

View File

@@ -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;