--- a/src/wifi/model/mac-low.cc Mon May 04 23:55:32 2015 +0200
+++ b/src/wifi/model/mac-low.cc Tue May 05 00:29:40 2015 +0200
@@ -913,7 +913,8 @@
rxSnr, txMode);
m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
rxSnr, txMode, tag.Get ());
-
+
+ FlushAggregateQueue();
bool gotAck = false;
if (m_txParams.MustWaitNormalAck ()
&& m_normalAckTimeoutEvent.IsRunning ())
@@ -951,6 +952,7 @@
m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode);
m_sentMpdus = 0;
m_ampdu = false;
+ FlushAggregateQueue();
}
else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
{
@@ -1576,6 +1578,7 @@
m_listener = 0;
m_sentMpdus = 0;
m_ampdu = false;
+ FlushAggregateQueue();
listener->MissedAck ();
}
void
@@ -1606,6 +1609,7 @@
m_listener = 0;
m_sentMpdus = 0;
m_ampdu = false;
+ FlushAggregateQueue();
listener->MissedBlockAck ();
}
void
@@ -1992,6 +1996,19 @@
NS_ASSERT (m_currentPacket != 0);
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
+ if (m_aggregateQueue->GetSize () != 0)
+ {
+ for(int i = 0; i < m_txPackets.size(); i++)
+ {
+ uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr);
+ AcIndex ac = QosUtilsMapTidToAc (tid);
+ std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
+
+ listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp);
+ }
+ m_txPackets.clear ();
+ }
+
WifiPreamble preamble;
if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
//In the future has to make sure that receiver has greenfield enabled
@@ -2743,13 +2760,27 @@
m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
if (i == 1 && hdr.IsQosData ())
{
- listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
+ if (!m_txParams.MustSendRts ())
+ {
+ listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
+ }
+ else
+ {
+ InsertInTxQueue (packet, hdr, tstamp);
+ }
}
NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
i++;
isAmpdu = true;
m_sentMpdus++;
- listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+ if (!m_txParams.MustSendRts ())
+ {
+ listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+ }
+ else
+ {
+ InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
+ }
if (retry)
listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
else
@@ -2849,6 +2880,19 @@
{
NS_LOG_DEBUG("Flush aggregate queue");
m_aggregateQueue->Flush ();
+ m_txPackets.clear ();
+}
+
+void
+MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
+{
+ Item item;
+
+ item.packet = packet;
+ item.hdr = hdr;
+ item.timestamp = tStamp;
+
+ m_txPackets.push_back (item);
}
Ptr<Packet>