--- a/src/wifi/model/mac-low.cc Tue Jun 16 13:13:06 2015 -0700
+++ b/src/wifi/model/mac-low.cc Sun Jun 21 00:23:45 2015 +0200
@@ -77,38 +77,38 @@
void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
{
}
-void MacLowAggregationCapableTransmissionListener::CompleteTransfer(Mac48Address address, uint8_t tid)
+void MacLowAggregationCapableTransmissionListener::CompleteTransfer (Mac48Address address, uint8_t tid)
{
}
void
MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
{
}
-uint16_t
+uint16_t
MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
{
- return 0;
+ return 0;
}
-uint16_t
+uint16_t
MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
{
- return 0;
+ return 0;
}
-Ptr<const Packet>
+Ptr<const Packet>
MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
{
- return 0;
+ return 0;
}
-void
+void
MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
{
}
-uint32_t
+uint32_t
MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
{
return 0;
}
-uint32_t
+uint32_t
MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
{
return 0;
@@ -267,10 +267,10 @@
std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters ¶ms)
{
os << "["
- << "send rts=" << params.m_sendRts << ", "
- << "next size=" << params.m_nextSize << ", "
- << "dur=" << params.m_overrideDurationId << ", "
- << "ack=";
+ << "send rts=" << params.m_sendRts << ", "
+ << "next size=" << params.m_nextSize << ", "
+ << "dur=" << params.m_overrideDurationId << ", "
+ << "ack=";
switch (params.m_waitAck)
{
case MacLowTransmissionParameters::ACK_NONE:
@@ -390,7 +390,7 @@
.SetParent<Object> ()
.SetGroupName ("Wifi")
.AddConstructor<MacLow> ()
- ;
+ ;
return tid;
}
@@ -427,13 +427,13 @@
m_sendDataEvent.Cancel ();
m_waitSifsEvent.Cancel ();
m_endTxNoAckEvent.Cancel ();
- m_waitRifsEvent.Cancel();
+ m_waitRifsEvent.Cancel ();
m_phy = 0;
m_stationManager = 0;
if (m_phyMacLowListener != 0)
{
- delete m_phyMacLowListener;
- m_phyMacLowListener = 0;
+ delete m_phyMacLowListener;
+ m_phyMacLowListener = 0;
}
m_mpduAggregator = 0;
m_sentMpdus = 0;
@@ -501,7 +501,7 @@
m_waitRifsEvent.Cancel ();
oneRunning = true;
}
- if (m_endTxNoAckEvent.IsRunning ())
+ if (m_endTxNoAckEvent.IsRunning ())
{
m_endTxNoAckEvent.Cancel ();
oneRunning = true;
@@ -706,14 +706,16 @@
WifiMacTrailer fcs;
size = packet->GetSize () + hdr.GetSize () + fcs.GetSerializedSize ();
Ptr<Packet> p = AggregateToAmpdu (packet, hdr);
- actualSize = p->GetSize();
+ actualSize = p->GetSize ();
if (actualSize > size)
{
m_currentPacket = p;
return true;
}
else
+ {
return false;
+ }
}
void
@@ -742,25 +744,27 @@
m_listener = listener;
m_txParams = params;
- if(m_aggregateQueue->GetSize () == 0)
- {
- m_currentPacket = packet->Copy ();
- m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
- }
+ if (m_aggregateQueue->GetSize () == 0)
+ {
+ m_currentPacket = packet->Copy ();
+ m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
+ }
else
- {
- /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
- *In that case, we transmit the same A-MPDU as previously.
- */
- m_sentMpdus = m_aggregateQueue->GetSize ();
- m_ampdu = true;
- }
+ {
+ /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
+ *In that case, we transmit the same A-MPDU as previously.
+ */
+ m_sentMpdus = m_aggregateQueue->GetSize ();
+ m_ampdu = true;
+ }
NS_LOG_DEBUG ("startTx size=" << GetSize (m_currentPacket, &m_currentHdr) <<
", to=" << m_currentHdr.GetAddr1 () << ", listener=" << m_listener);
if (m_ampdu)
+ {
m_txParams.EnableCompressedBlockAck ();
+ }
if (m_txParams.MustSendRts ())
{
@@ -768,14 +772,14 @@
}
else
{
- if (NeedCtsToSelf() && m_ctsToSelfSupported)
+ if (NeedCtsToSelf () && m_ctsToSelfSupported)
{
- SendCtsToSelf();
+ SendCtsToSelf ();
}
else
{
SendDataPacket ();
- }
+ }
}
/* When this method completes, we have taken ownership of the medium. */
@@ -795,16 +799,16 @@
NS_LOG_FUNCTION (this << packet << rxSnr);
NS_LOG_DEBUG ("rx failed ");
AmpduTag ampdu;
- Ptr<Packet> pkt = packet->Copy();
- bool isInAmpdu = pkt->RemovePacketTag(ampdu);
+ Ptr<Packet> pkt = packet->Copy ();
+ bool isInAmpdu = pkt->RemovePacketTag (ampdu);
- if(isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus() == 1))
+ if (isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus () == 1))
{
MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt);
MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
WifiMacHeader hdr;
- (*n).first->PeekHeader(hdr);
- if(hdr.IsQosData())
+ (*n).first->PeekHeader (hdr);
+ if (hdr.IsQosData ())
{
NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
m_sendAckEvent = Simulator::Schedule (GetSifs (),
@@ -814,10 +818,10 @@
hdr.GetDuration (),
m_currentTxVector);
}
- else if (hdr.IsBlockAckReq())
+ else if (hdr.IsBlockAckReq ())
{
- NS_LOG_DEBUG("last a-mpdu subframe is BAR");
- }
+ NS_LOG_DEBUG ("last a-mpdu subframe is BAR");
+ }
m_receivedAtLeastOneMpdu = false;
}
else if (m_txParams.MustWaitFastAck ())
@@ -918,9 +922,9 @@
{
NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
}
-
+
NS_LOG_DEBUG ("receive cts from=" << m_currentHdr.GetAddr1 ());
-
+
SnrTag tag;
packet->RemovePacketTag (tag);
m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
@@ -954,7 +958,7 @@
FlushAggregateQueue ();
bool gotAck = false;
-
+
if (m_txParams.MustWaitNormalAck ()
&& m_normalAckTimeoutEvent.IsRunning ())
{
@@ -1052,7 +1056,7 @@
Upon the receipt of a QoS data frame from the originator for which
the Block Ack agreement exists, the recipient shall buffer the MSDU
regardless of the value of the Ack Policy subfield within the
- QoS Control field of the QoS data frame. */;
+ QoS Control field of the QoS data frame. */
if (hdr.IsQosAck () && !ampduSubframe)
{
NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
@@ -1094,14 +1098,14 @@
}
else if (hdr.IsQosData () && hdr.IsQosNoAck ())
{
- if (ampduSubframe)
- {
- NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
- }
- else
- {
- NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
- }
+ if (ampduSubframe)
+ {
+ NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
+ }
+ else
+ {
+ NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
+ }
}
else if (hdr.IsData () || hdr.IsMgt ())
{
@@ -1167,20 +1171,22 @@
MacLow::GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const
{
uint8_t tid = 0;
- if (hdr.IsQosData ())
- tid = hdr.GetQosTid ();
+ if (hdr.IsQosData ())
+ {
+ tid = hdr.GetQosTid ();
+ }
else if (hdr.IsBlockAckReq ())
{
CtrlBAckRequestHeader baReqHdr;
packet->PeekHeader (baReqHdr);
tid = baReqHdr.GetTidInfo ();
- }
+ }
else if (hdr.IsBlockAck ())
{
CtrlBAckResponseHeader baRespHdr;
packet->PeekHeader (baRespHdr);
tid = baRespHdr.GetTidInfo ();
- }
+ }
return tid;
}
@@ -1233,7 +1239,7 @@
MacLow::GetAckDuration (WifiTxVector ackTxVector) const
{
NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
- return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
+ return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency (), 0, 0);
}
Time
@@ -1245,9 +1251,13 @@
*/
WifiPreamble preamble;
if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency (), 0, 0);
}
@@ -1279,9 +1289,13 @@
uint32_t size;
WifiMacTrailer fcs;
if (m_ampdu)
- size = packet->GetSize ();
+ {
+ size = packet->GetSize ();
+ }
else
- size= packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
+ {
+ size = packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
+ }
return size;
}
@@ -1303,7 +1317,7 @@
{
Mac48Address to = hdr->GetAddr1 ();
WifiMacTrailer fcs;
- uint32_t size = packet->GetSize ()+ hdr->GetSize () + fcs.GetSerializedSize ();
+ uint32_t size = packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
//size is not used in anything!! will not worry about aggregation
return m_stationManager->GetDataTxVector (to, hdr, packet, size);
}
@@ -1364,11 +1378,17 @@
}
WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- preamble = WIFI_PREAMBLE_HT_GF;
+ {
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
uint32_t dataSize = GetSize (packet, hdr);
txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
if (params.MustWaitAck ())
@@ -1390,11 +1410,17 @@
WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
WifiPreamble preamble;
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- preamble = WIFI_PREAMBLE_HT_GF;
- else if (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
+ else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
txTime += GetSifs ();
txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
}
@@ -1432,7 +1458,7 @@
*/
WifiMacHeader cts;
cts.SetType (WIFI_MAC_CTL_CTS);
- WifiTxVector txVector=GetRtsTxVector (packet, &hdr);
+ WifiTxVector txVector = GetRtsTxVector (packet, &hdr);
Time navCounterResetCtsMissedDelay =
m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency (), 0, 0) +
Time (2 * GetSifs ()) + Time (2 * GetSlotTime ());
@@ -1545,7 +1571,7 @@
AmpduTag ampdutag;
ampdutag.SetAmpdu (true);
Time delay = Seconds (0);
- for ( ; queueSize > 0; queueSize--)
+ for (; queueSize > 0; queueSize--)
{
dequeuedPacket = m_aggregateQueue->Dequeue (&newHdr);
newPacket = dequeuedPacket->Copy ();
@@ -1559,11 +1585,11 @@
}
m_mpduAggregator->AddHeaderAndPad (newPacket, last);
- ampdutag.SetNoOfMpdus(queueSize);
- newPacket->AddPacketTag(ampdutag);
+ ampdutag.SetNoOfMpdus (queueSize);
+ newPacket->AddPacketTag (ampdutag);
if (delay == Seconds (0))
{
- NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
+ NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
packetType = 1;
m_phy->SendPacket (newPacket, txVector, preamble, packetType);
}
@@ -1571,8 +1597,10 @@
{
Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
}
- if(queueSize > 1)
- delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0);
+ if (queueSize > 1)
+ {
+ delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0);
+ }
preamble = WIFI_PREAMBLE_NONE;
}
}
@@ -1581,8 +1609,8 @@
void
MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
{
- NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
- m_phy->SendPacket (packet, txVector, preamble, packetType);
+ NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
+ m_phy->SendPacket (packet, txVector, preamble, packetType);
}
void
@@ -1594,7 +1622,7 @@
/// we should restart a new cts timeout now until the expected
/// end of rx if there was a rx start before now.
m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
- if(m_sentMpdus == 0)
+ if (m_sentMpdus == 0)
{
m_currentPacket = 0;
}
@@ -1651,7 +1679,7 @@
m_listener = 0;
m_sentMpdus = 0;
m_ampdu = false;
- FlushAggregateQueue();
+ FlushAggregateQueue ();
listener->MissedBlockAck ();
}
@@ -1693,9 +1721,13 @@
WifiPreamble preamble;
//standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- preamble = WIFI_PREAMBLE_HT_GF;
+ {
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
- preamble = WIFI_PREAMBLE_LONG;
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
if (m_txParams.HasDurationId ())
{
@@ -1756,15 +1788,21 @@
MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
{
WifiPreamble preamble;
-
+
//Since it is data then it can have format = GF
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- preamble = WIFI_PREAMBLE_HT_GF;
+ {
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
-
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
+
Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
if (m_txParams.MustWaitNormalAck ())
{
@@ -1804,23 +1842,23 @@
}
else if (m_txParams.HasNextPacket ())
{
- if (m_stationManager->HasHtSupported())
- {
+ if (m_stationManager->HasHtSupported ())
+ {
Time delay = txDuration + GetRifs ();
NS_ASSERT (m_waitRifsEvent.IsExpired ());
- m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
- }
- else
- {
+ m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
+ }
+ else
+ {
Time delay = txDuration + GetSifs ();
NS_ASSERT (m_waitSifsEvent.IsExpired ());
m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
- }
+ }
}
else
{
// since we do not expect any timer to be triggered.
- Simulator::Schedule(txDuration, &MacLow::EndTxNoAck, this);
+ Simulator::Schedule (txDuration, &MacLow::EndTxNoAck, this);
}
}
@@ -1831,15 +1869,21 @@
/* send this packet directly. No RTS is needed. */
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
WifiPreamble preamble;
-
+
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- //In the future has to make sure that receiver has greenfield enabled
- preamble = WIFI_PREAMBLE_HT_GF;
+ {
+ //In the future has to make sure that receiver has greenfield enabled
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
-
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
+
StartDataTxTimers (dataTxVector);
Time duration = Seconds (0.0);
@@ -1914,15 +1958,19 @@
cts.SetNoMoreFragments ();
cts.SetNoRetry ();
cts.SetAddr1 (m_self);
-
+
WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
WifiPreamble preamble;
if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
-
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
+
Time duration = Seconds (0);
if (m_txParams.HasDurationId ())
@@ -1937,7 +1985,7 @@
dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
if (m_txParams.MustWaitBasicBlockAck ())
{
-
+
duration += GetSifs ();
WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
@@ -1984,7 +2032,7 @@
Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
txDuration += GetSifs ();
NS_ASSERT (m_sendDataEvent.IsExpired ());
-
+
m_sendDataEvent = Simulator::Schedule (txDuration,
&MacLow::SendDataAfterCts, this,
cts.GetAddr1 (),
@@ -2033,29 +2081,35 @@
*/
NS_ASSERT (m_currentPacket != 0);
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
-
+
if (m_aggregateQueue->GetSize () != 0)
- {
- for (std::vector<Item>::size_type 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);
+ for (std::vector<Item>::size_type 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 ();
}
- m_txPackets.clear ();
- }
-
- WifiPreamble preamble;
+
+ WifiPreamble preamble;
if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- //In the future has to make sure that receiver has greenfield enabled
- preamble = WIFI_PREAMBLE_HT_GF;
+ {
+ //In the future has to make sure that receiver has greenfield enabled
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
-
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
+
StartDataTxTimers (dataTxVector);
Time newDuration = Seconds (0);
if (m_txParams.MustWaitBasicBlockAck ())
@@ -2081,14 +2135,14 @@
newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
if (m_txParams.MustWaitCompressedBlockAck ())
{
- newDuration += GetSifs ();
- WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
- newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
+ newDuration += GetSifs ();
+ WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
+ newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
}
else if (m_txParams.MustWaitAck ())
{
- newDuration += GetSifs ();
- newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
+ newDuration += GetSifs ();
+ newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
}
}
@@ -2101,11 +2155,11 @@
m_currentHdr.SetDuration (duration);
if (!m_ampdu)
- {
- m_currentPacket->AddHeader (m_currentHdr);
- WifiMacTrailer fcs;
- m_currentPacket->AddTrailer (fcs);
- }
+ {
+ m_currentPacket->AddHeader (m_currentHdr);
+ WifiMacTrailer fcs;
+ m_currentPacket->AddTrailer (fcs);
+ }
ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
m_currentPacket = 0;
@@ -2117,7 +2171,7 @@
m_listener->StartNext ();
}
-void
+void
MacLow::EndTxNoAck (void)
{
MacLowTransmissionListener *listener = m_listener;
@@ -2174,45 +2228,49 @@
return ((seq - winstart + 4096) % 4096) < winsize;
}
-bool
+bool
MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr)
- {
+{
if (m_stationManager->HasHtSupported ())
{
Mac48Address originator = hdr.GetAddr2 ();
uint8_t tid = 0;
if (hdr.IsQosData ())
- tid = hdr.GetQosTid ();
+ {
+ tid = hdr.GetQosTid ();
+ }
uint16_t seqNumber = hdr.GetSequenceNumber ();
AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
if (it != m_bAckAgreements.end ())
{
//Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet
if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
- {
+ {
StoreMpduIfNeeded (packet, hdr);
- if (!IsInWindow(hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
+ if (!IsInWindow (hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
{
- uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd() + 4096) % 4096;
+ uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd () + 4096) % 4096;
if (delta > 1)
{
- (*it).second.first.SetWinEnd (seqNumber);
- int16_t winEnd = (*it).second.first.GetWinEnd ();
- int16_t bufferSize = (*it).second.first.GetBufferSize ();
- uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096;
- (*it).second.first.SetStartingSequence (sum);
- RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
- }
- }
+ (*it).second.first.SetWinEnd (seqNumber);
+ int16_t winEnd = (*it).second.first.GetWinEnd ();
+ int16_t bufferSize = (*it).second.first.GetBufferSize ();
+ uint16_t sum = ((uint16_t)(std::abs (winEnd - bufferSize + 1))) % 4096;
+ (*it).second.first.SetStartingSequence (sum);
+ RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
+ }
+ }
RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
- (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
- }
+ (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
+ }
return true;
- }
+ }
return false;
}
- else
- return StoreMpduIfNeeded (packet, hdr);
+ else
+ {
+ return StoreMpduIfNeeded (packet, hdr);
+ }
}
bool
@@ -2232,7 +2290,6 @@
for (; i != (*it).second.second.end ()
&& QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++)
{
- ;
}
(*it).second.second.insert (i, bufferedPacket);
@@ -2456,14 +2513,18 @@
packet->AddTrailer (fcs);
WifiPreamble preamble;
if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
else
- preamble = WIFI_PREAMBLE_LONG;
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
m_currentPacket = 0;
}
-void
+void
MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
{
NS_LOG_FUNCTION (this);
@@ -2480,7 +2541,7 @@
immediate = (*it).second.first.IsImmediateBlockAck ();
blockAck.SetType (COMPRESSED_BLOCK_ACK);
NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
- (*i).second.FillBlockAckBitmap (&blockAck);
+ (*i).second.FillBlockAckBitmap (&blockAck);
SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode ());
}
@@ -2515,7 +2576,7 @@
(*i).second.FillBlockAckBitmap (&blockAck);
NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
- if (!m_stationManager->HasHtSupported())
+ if (!m_stationManager->HasHtSupported ())
{
/* All packets with smaller sequence than starting sequence control must be passed up to Wifimac
* See 9.10.3 in IEEE 802.11e standard.
@@ -2525,13 +2586,13 @@
}
else
{
- if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence(), reqHdr.GetStartingSequence ()))
- {
+ if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), reqHdr.GetStartingSequence ()))
+ {
(*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ());
- (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
+ (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
- (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
+ (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
}
}
}
@@ -2584,7 +2645,7 @@
AmpduTag ampdu;
bool normalAck = false;
bool ampduSubframe = false;
- if (aggregatedPacket->RemovePacketTag(ampdu))
+ if (aggregatedPacket->RemovePacketTag (ampdu))
{
ampduSubframe = true;
MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket);
@@ -2594,12 +2655,14 @@
(*n).first->PeekHeader (firsthdr);
NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
NotifyNav ((*n).first, firsthdr, preamble);
-
+
if (firsthdr.GetAddr1 () == m_self)
{
m_receivedAtLeastOneMpdu = true;
if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
+ {
ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
+ }
else if (firsthdr.IsData () || firsthdr.IsQosData ())
{
NS_LOG_DEBUG ("Deaggregate packet with sequence=" << firsthdr.GetSequenceNumber ());
@@ -2609,13 +2672,15 @@
NS_LOG_DEBUG ("Normal Ack");
normalAck = true;
}
- }
+ }
else
+ {
NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
+ }
}
if (normalAck && (ampdu.GetNoOfMpdus () == 1))
- {
+ {
//send block Ack
if (firsthdr.IsBlockAckReq ())
{
@@ -2624,7 +2689,7 @@
uint8_t tid = firsthdr.GetQosTid ();
AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
if (it != m_bAckAgreements.end ())
- {
+ {
NS_ASSERT (m_sendAckEvent.IsExpired ());
/* See section 11.5.3 in IEEE 802.11 for mean of this timer */
ResetBlockAckInactivityTimerIfNeeded (it->second.first);
@@ -2635,43 +2700,55 @@
firsthdr.GetAddr2 (),
firsthdr.GetDuration (),
txVector);
- }
+ }
else
- {
+ {
NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
}
m_receivedAtLeastOneMpdu = false;
}
}
else
- {
- ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
+ {
+ ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
}
}
-bool
-MacLow::StopMpduAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
+bool
+MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
{
- WifiPreamble preamble;
- WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
- if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
- preamble = WIFI_PREAMBLE_HT_GF;
- else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
- preamble = WIFI_PREAMBLE_HT_MF;
- else
- preamble = WIFI_PREAMBLE_LONG;
-
- if (peekedPacket == 0)
- return true;
-
- //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
- if(m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds(10))
- return true;
-
- if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
- return true;
-
- return false;
+ WifiPreamble preamble;
+ WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
+ if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+ {
+ preamble = WIFI_PREAMBLE_HT_GF;
+ }
+ else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+ {
+ preamble = WIFI_PREAMBLE_HT_MF;
+ }
+ else
+ {
+ preamble = WIFI_PREAMBLE_LONG;
+ }
+
+ if (peekedPacket == 0)
+ {
+ return true;
+ }
+
+ //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
+ if (m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds (10))
+ {
+ return true;
+ }
+
+ if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
+ {
+ return true;
+ }
+
+ return false;
}
Ptr<Packet>
@@ -2681,23 +2758,23 @@
bool isAmpdu = false;
Ptr<Packet> newPacket, tempPacket;
WifiMacHeader peekedHdr;
- newPacket = packet->Copy();
+ newPacket = packet->Copy ();
//missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
- if (hdr.IsQosData() || hdr.IsBlockAck()|| hdr.IsBlockAckReq())
+ if (hdr.IsQosData () || hdr.IsBlockAck ()|| hdr.IsBlockAckReq ())
{
Time tstamp;
uint8_t tid = GetTid (packet, hdr);
Ptr<WifiMacQueue> queue;
AcIndex ac = QosUtilsMapTidToAc (tid);
//since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
- std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
+ std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
NS_ASSERT (listenerIt != m_edcaListeners.end ());
- queue = listenerIt->second->GetQueue();
-
- if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator!= 0)
+ queue = listenerIt->second->GetQueue ();
+
+ if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator != 0)
{
//Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager)
- if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1(), tid))
+ if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid))
{
/* here is performed mpdu aggregation */
/* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/
@@ -2711,31 +2788,31 @@
int i = 0;
Ptr<Packet> aggPacket = newPacket->Copy ();
- if (!hdr.IsBlockAckReq())
+ if (!hdr.IsBlockAckReq ())
{
- if (!hdr.IsBlockAck())
+ if (!hdr.IsBlockAck ())
{
- startingSequenceNumber = peekedHdr.GetSequenceNumber();
- peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+ startingSequenceNumber = peekedHdr.GetSequenceNumber ();
+ peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
}
- currentSequenceNumber = peekedHdr.GetSequenceNumber();
+ currentSequenceNumber = peekedHdr.GetSequenceNumber ();
newPacket->AddHeader (peekedHdr);
WifiMacTrailer fcs;
newPacket->AddTrailer (fcs);
- aggregated=m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
+ aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
if (aggregated)
{
- NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
+ NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
i++;
m_sentMpdus++;
m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
}
- }
- else if (hdr.IsBlockAckReq())
+ }
+ else if (hdr.IsBlockAckReq ())
{
- blockAckSize = packet->GetSize() + hdr.GetSize() + WIFI_MAC_FCS_LENGTH;
+ blockAckSize = packet->GetSize () + hdr.GetSize () + WIFI_MAC_FCS_LENGTH;
qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack
CtrlBAckRequestHeader blockAckReq;
packet->PeekHeader (blockAckReq);
@@ -2751,22 +2828,24 @@
WifiMacHeader::ADDR1,
hdr.GetAddr1 (), &tstamp);
currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-
+
/* here is performed MSDU aggregation (two-level aggregation) */
if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0)
{
- tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
- if (tempPacket != 0) //MSDU aggregation
- peekedPacket = tempPacket->Copy();
+ tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+ if (tempPacket != 0) //MSDU aggregation
+ {
+ peekedPacket = tempPacket->Copy ();
+ }
}
}
else
{
retry = true;
- currentSequenceNumber = peekedHdr.GetSequenceNumber();
+ currentSequenceNumber = peekedHdr.GetSequenceNumber ();
}
- while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
+ while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
{
//for now always send AMPDU with normal ACK
if (retry == false)
@@ -2776,15 +2855,19 @@
peekedHdr.SetFragmentNumber (0);
peekedHdr.SetNoMoreFragments ();
peekedHdr.SetNoRetry ();
- }
+ }
if (qosPolicy == 0)
+ {
peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+ }
else
+ {
peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
+ }
newPacket = peekedPacket->Copy ();
Ptr<Packet> aggPacket = newPacket->Copy ();
-
+
newPacket->AddHeader (peekedHdr);
WifiMacTrailer fcs;
newPacket->AddTrailer (fcs);
@@ -2793,39 +2876,45 @@
{
m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
if (i == 1 && hdr.IsQosData ())
- {
- if (!m_txParams.MustSendRts ())
{
- listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
+ if (!m_txParams.MustSendRts ())
+ {
+ listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
+ }
+ else
+ {
+ InsertInTxQueue (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 ());
+ 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++;
if (!m_txParams.MustSendRts ())
- {
- listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
- }
+ {
+ listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+ }
else
- {
- InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
- }
+ {
+ InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
+ }
if (retry)
+ {
listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
+ }
else
+ {
queue->Remove (peekedPacket);
+ }
newPacket = 0;
}
else
+ {
break;
+ }
if (retry == true)
{
- peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.GetAddr1(), tid, &tstamp);
+ peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, hdr.GetAddr1 (), tid, &tstamp);
if (peekedPacket == 0)
{
//I reached the first packet that I added to this A-MPDU
@@ -2836,17 +2925,21 @@
{
//find what will the sequence number be so that we don't send more than 64 packets apart
currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-
+
if (listenerIt->second->GetMsduAggregator () != 0)
- {
- tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
- if (tempPacket != 0) //MSDU aggregation
- peekedPacket = tempPacket->Copy();
- }
- }
+ {
+ tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+ if (tempPacket != 0) //MSDU aggregation
+ {
+ peekedPacket = tempPacket->Copy ();
+ }
+ }
+ }
}
else
- currentSequenceNumber = peekedHdr.GetSequenceNumber();
+ {
+ currentSequenceNumber = peekedHdr.GetSequenceNumber ();
+ }
}
else
{
@@ -2856,42 +2949,44 @@
{
//find what will the sequence number be so that we don't send more than 64 packets apart
currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-
+
if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64))
- {
- tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
- if (tempPacket != 0) //MSDU aggregation
- peekedPacket = tempPacket->Copy();
- }
- }
+ {
+ tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+ if (tempPacket != 0) //MSDU aggregation
+ {
+ peekedPacket = tempPacket->Copy ();
+ }
+ }
+ }
}
}
if (isAmpdu)
{
- if (hdr.IsBlockAckReq())
+ if (hdr.IsBlockAckReq ())
{
- newPacket = packet->Copy();
+ newPacket = packet->Copy ();
peekedHdr = hdr;
- Ptr<Packet> aggPacket = newPacket->Copy();
+ Ptr<Packet> aggPacket = newPacket->Copy ();
m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
newPacket->AddHeader (peekedHdr);
WifiMacTrailer fcs;
newPacket->AddTrailer (fcs);
m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
}
- if (qosPolicy==0)
+ if (qosPolicy == 0)
{
- listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid);
+ listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid);
}
//Add packet tag
AmpduTag ampdutag;
ampdutag.SetAmpdu (true);
- ampdutag.SetNoOfMpdus(i);
+ ampdutag.SetNoOfMpdus (i);
newPacket = currentAggregatedPacket;
- newPacket->AddPacketTag(ampdutag);
+ newPacket->AddPacketTag (ampdutag);
currentAggregatedPacket = 0;
NS_LOG_DEBUG ("tx unicast A-MPDU");
- listenerIt->second->SetAmpdu(true);
+ listenerIt->second->SetAmpdu (true);
}
else
{
@@ -2913,10 +3008,10 @@
MacLow::FlushAggregateQueue (void)
{
if (m_aggregateQueue->GetSize () > 0)
- {
- NS_LOG_DEBUG("Flush aggregate queue");
- m_aggregateQueue->Flush ();
- }
+ {
+ NS_LOG_DEBUG ("Flush aggregate queue");
+ m_aggregateQueue->Flush ();
+ }
m_txPackets.clear ();
}
@@ -2924,7 +3019,7 @@
MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
{
Item item;
-
+
item.packet = packet;
item.hdr = hdr;
item.timestamp = tStamp;
@@ -2933,7 +3028,7 @@
}
Ptr<Packet>
-MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
+MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
{
bool msduAggregation = false;
bool isAmsdu = false;
@@ -2944,46 +3039,46 @@
AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
NS_ASSERT (listenerIt != m_edcaListeners.end ());
- queue = listenerIt->second->GetQueue();
-
+ queue = listenerIt->second->GetQueue ();
+
listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
- listenerIt->second->GetSrcAddressForAggregation (*hdr),
- listenerIt->second->GetDestAddressForAggregation (*hdr));
+ listenerIt->second->GetSrcAddressForAggregation (*hdr),
+ listenerIt->second->GetDestAddressForAggregation (*hdr));
Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
while (peekedPacket != 0)
- {
- tempPacket = currentAmsduPacket;
-
- msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
- listenerIt->second->GetSrcAddressForAggregation (*hdr),
- listenerIt->second->GetDestAddressForAggregation (*hdr));
-
- if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
- {
- isAmsdu = true;
- currentAmsduPacket = tempPacket;
- queue->Remove (peekedPacket);
- }
- else
{
- break;
+ tempPacket = currentAmsduPacket;
+
+ msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
+ listenerIt->second->GetSrcAddressForAggregation (*hdr),
+ listenerIt->second->GetDestAddressForAggregation (*hdr));
+
+ if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
+ {
+ isAmsdu = true;
+ currentAmsduPacket = tempPacket;
+ queue->Remove (peekedPacket);
+ }
+ else
+ {
+ break;
+ }
+ peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
}
- peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
- }
-
+
if (isAmsdu)
- {
- NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
- hdr->SetQosAmsdu ();
- hdr->SetAddr3 (GetBssid ());
- return currentAmsduPacket;
- }
+ {
+ NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
+ hdr->SetQosAmsdu ();
+ hdr->SetAddr3 (GetBssid ());
+ return currentAmsduPacket;
+ }
else
- {
- return 0;
- }
+ {
+ return 0;
+ }
}
-} // namespace ns3
+} //namespace ns3