From 916cd53bfa6a4206f3e6f1519bddc0b75565a24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 9 Dec 2018 12:14:03 +0100 Subject: [PATCH] wifi: Do not allow S-MPDU transmissions as long as ADDBA handshake is not established --- src/wifi/model/mac-low.cc | 57 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/wifi/model/mac-low.cc b/src/wifi/model/mac-low.cc index e972056a9..125248cd8 100644 --- a/src/wifi/model/mac-low.cc +++ b/src/wifi/model/mac-low.cc @@ -3075,37 +3075,40 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) } } } - // VHT/HE single MPDU operation - WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); - if (!isAmpdu - && hdr.IsQosData () - && (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT - || dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HE)) + if (edcaIt->second->GetBaAgreementEstablished (hdr.GetAddr1 (), tid)) { - peekedHdr = hdr; - peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); - - currentAggregatedPacket = Create (); - edcaIt->second->GetMpduAggregator ()->AggregateSingleMpdu (packet, currentAggregatedPacket); - m_aggregateQueue[tid]->Enqueue (Create (packet, peekedHdr)); - if (m_txParams.MustSendRts ()) + // VHT/HE single MPDU operation + WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); + if (!isAmpdu + && hdr.IsQosData () + && (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT + || dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HE)) { - InsertInTxQueue (packet, peekedHdr, tstamp, tid); - } - if (edcaIt->second->GetBaAgreementEstablished (hdr.GetAddr1 (), tid)) - { - edcaIt->second->CompleteAmpduTransfer (peekedHdr.GetAddr1 (), tid); - } + peekedHdr = hdr; + peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); - //Add packet tag - AmpduTag ampdutag; - newPacket = currentAggregatedPacket; - newPacket->AddHeader (peekedHdr); - AddWifiMacTrailer (newPacket); - newPacket->AddPacketTag (ampdutag); + currentAggregatedPacket = Create (); + edcaIt->second->GetMpduAggregator ()->AggregateSingleMpdu (packet, currentAggregatedPacket); + m_aggregateQueue[tid]->Enqueue (Create (packet, peekedHdr)); + if (m_txParams.MustSendRts ()) + { + InsertInTxQueue (packet, peekedHdr, tstamp, tid); + } + if (edcaIt->second->GetBaAgreementEstablished (hdr.GetAddr1 (), tid)) + { + edcaIt->second->CompleteAmpduTransfer (peekedHdr.GetAddr1 (), tid); + } - NS_LOG_DEBUG ("tx unicast S-MPDU with sequence number " << hdr.GetSequenceNumber ()); - edcaIt->second->SetAmpduExist (hdr.GetAddr1 (), true); + //Add packet tag + AmpduTag ampdutag; + newPacket = currentAggregatedPacket; + newPacket->AddHeader (peekedHdr); + AddWifiMacTrailer (newPacket); + newPacket->AddPacketTag (ampdutag); + + NS_LOG_DEBUG ("tx unicast S-MPDU with sequence number " << hdr.GetSequenceNumber ()); + edcaIt->second->SetAmpduExist (hdr.GetAddr1 (), true); + } } } }