|
|
| 898 |
m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr, |
898 |
m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr, |
| 899 |
rxSnr, txMode, tag.Get ()); |
899 |
rxSnr, txMode, tag.Get ()); |
| 900 |
|
900 |
|
|
|
901 |
FlushAggregateQueue(); |
| 901 |
bool gotAck = false; |
902 |
bool gotAck = false; |
| 902 |
if (m_txParams.MustWaitNormalAck () |
903 |
if (m_txParams.MustWaitNormalAck () |
| 903 |
&& m_normalAckTimeoutEvent.IsRunning ()) |
904 |
&& m_normalAckTimeoutEvent.IsRunning ()) |
|
|
| 935 |
m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode); |
936 |
m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode); |
| 936 |
m_sentMpdus = 0; |
937 |
m_sentMpdus = 0; |
| 937 |
m_ampdu = false; |
938 |
m_ampdu = false; |
|
|
939 |
FlushAggregateQueue(); |
| 938 |
} |
940 |
} |
| 939 |
else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self) |
941 |
else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self) |
| 940 |
{ |
942 |
{ |
|
|
| 1560 |
m_listener = 0; |
1562 |
m_listener = 0; |
| 1561 |
m_sentMpdus = 0; |
1563 |
m_sentMpdus = 0; |
| 1562 |
m_ampdu = false; |
1564 |
m_ampdu = false; |
|
|
1565 |
FlushAggregateQueue(); |
| 1563 |
listener->MissedAck (); |
1566 |
listener->MissedAck (); |
| 1564 |
} |
1567 |
} |
| 1565 |
void |
1568 |
void |
|
|
| 1590 |
m_listener = 0; |
1593 |
m_listener = 0; |
| 1591 |
m_sentMpdus = 0; |
1594 |
m_sentMpdus = 0; |
| 1592 |
m_ampdu = false; |
1595 |
m_ampdu = false; |
|
|
1596 |
FlushAggregateQueue(); |
| 1593 |
listener->MissedBlockAck (); |
1597 |
listener->MissedBlockAck (); |
| 1594 |
} |
1598 |
} |
| 1595 |
void |
1599 |
void |
|
|
| 1976 |
NS_ASSERT (m_currentPacket != 0); |
1980 |
NS_ASSERT (m_currentPacket != 0); |
| 1977 |
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
1981 |
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
| 1978 |
|
1982 |
|
|
|
1983 |
if (m_aggregateQueue->GetSize () != 0) |
| 1984 |
{ |
| 1985 |
for(int i = 0; i < m_txPackets.size(); i++) |
| 1986 |
{ |
| 1987 |
uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr); |
| 1988 |
AcIndex ac = QosUtilsMapTidToAc (tid); |
| 1989 |
std::map<AcIndex, MacLowBlockAckEventListener*>::const_iterator listenerIt= m_edcaListeners.find(ac); |
| 1990 |
|
| 1991 |
listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp); |
| 1992 |
} |
| 1993 |
m_txPackets.clear (); |
| 1994 |
} |
| 1995 |
|
| 1979 |
WifiPreamble preamble; |
1996 |
WifiPreamble preamble; |
| 1980 |
if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
1997 |
if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
| 1981 |
//In the future has to make sure that receiver has greenfield enabled |
1998 |
//In the future has to make sure that receiver has greenfield enabled |
|
|
| 2719 |
m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2736 |
m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
| 2720 |
if (i == 1 && hdr.IsQosData ()) |
2737 |
if (i == 1 && hdr.IsQosData ()) |
| 2721 |
{ |
2738 |
{ |
|
|
2739 |
if (!m_txParams.MustSendRts ()) |
| 2740 |
{ |
| 2722 |
listenerIt->second->CompleteMpduTx (packet, hdr, tstamp); |
2741 |
listenerIt->second->CompleteMpduTx (packet, hdr, tstamp); |
|
|
2742 |
} |
| 2743 |
else |
| 2744 |
{ |
| 2745 |
InsertInTxQueue (packet, hdr, tstamp); |
| 2746 |
} |
| 2723 |
} |
2747 |
} |
| 2724 |
NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU"); |
2748 |
NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU"); |
| 2725 |
i++; |
2749 |
i++; |
| 2726 |
isAmpdu = true; |
2750 |
isAmpdu = true; |
| 2727 |
m_sentMpdus++; |
2751 |
m_sentMpdus++; |
| 2728 |
listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp); |
2752 |
if (!m_txParams.MustSendRts ()) |
|
|
2753 |
{ |
| 2754 |
listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp); |
| 2755 |
} |
| 2756 |
else |
| 2757 |
{ |
| 2758 |
InsertInTxQueue (peekedPacket, peekedHdr, tstamp); |
| 2759 |
} |
| 2729 |
if (retry) |
2760 |
if (retry) |
| 2730 |
listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ()); |
2761 |
listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ()); |
| 2731 |
else |
2762 |
else |
|
|
| 2811 |
{ |
2842 |
{ |
| 2812 |
NS_LOG_DEBUG("Flush aggregate queue"); |
2843 |
NS_LOG_DEBUG("Flush aggregate queue"); |
| 2813 |
m_aggregateQueue->Flush (); |
2844 |
m_aggregateQueue->Flush (); |
|
|
2845 |
m_txPackets.clear (); |
| 2846 |
} |
| 2847 |
|
| 2848 |
void |
| 2849 |
MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp) |
| 2850 |
{ |
| 2851 |
Item item; |
| 2852 |
|
| 2853 |
item.packet = packet; |
| 2854 |
item.hdr = hdr; |
| 2855 |
item.timestamp = tStamp; |
| 2856 |
|
| 2857 |
m_txPackets.push_back (item); |
| 2814 |
} |
2858 |
} |
| 2815 |
|
2859 |
|
| 2816 |
} // namespace ns3 |
2860 |
} // namespace ns3 |