|
|
| 533 |
MacLow::ResetPhy (void) |
533 |
MacLow::ResetPhy (void) |
| 534 |
{ |
534 |
{ |
| 535 |
m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> ()); |
535 |
m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> ()); |
| 536 |
m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<const Packet>, double, bool> ()); |
536 |
m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<Packet>, double, bool> ()); |
| 537 |
RemovePhyMacLowListener (m_phy); |
537 |
RemovePhyMacLowListener (m_phy); |
| 538 |
m_phy = 0; |
538 |
m_phy = 0; |
| 539 |
} |
539 |
} |
|
Lines 837-850
MacLow::NeedCtsToSelf (void)
|
Link Here
|
|---|
|
| 837 |
} |
837 |
} |
| 838 |
|
838 |
|
| 839 |
void |
839 |
void |
| 840 |
MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr, bool isEndOfFrame) |
840 |
MacLow::ReceiveError (Ptr<Packet> packet, double rxSnr, bool isEndOfFrame) |
| 841 |
{ |
841 |
{ |
| 842 |
NS_LOG_FUNCTION (this << packet << rxSnr << isEndOfFrame); |
842 |
NS_LOG_FUNCTION (this << packet << rxSnr << isEndOfFrame); |
| 843 |
NS_LOG_DEBUG ("rx failed "); |
843 |
NS_LOG_DEBUG ("rx failed "); |
| 844 |
if (isEndOfFrame == true && m_receivedAtLeastOneMpdu == true) |
844 |
if (isEndOfFrame == true && m_receivedAtLeastOneMpdu == true) |
| 845 |
{ |
845 |
{ |
| 846 |
WifiMacHeader hdr; |
846 |
WifiMacHeader hdr; |
| 847 |
packet->PeekHeader (hdr); |
847 |
MpduAggregator::DeaggregatedMpdus mpdu = MpduAggregator::Deaggregate (packet); |
|
|
848 |
mpdu.begin ()->first->PeekHeader (hdr); |
| 848 |
if (hdr.GetAddr1 () != m_self) |
849 |
if (hdr.GetAddr1 () != m_self) |
| 849 |
{ |
850 |
{ |
| 850 |
NS_LOG_DEBUG ("hdr addr1 " << hdr.GetAddr1 () << "not for me (" << m_self << "); returning"); |
851 |
NS_LOG_DEBUG ("hdr addr1 " << hdr.GetAddr1 () << "not for me (" << m_self << "); returning"); |
|
Lines 1635-1641
MacLow::ForwardDown (Ptr<const Packet> p
|
Link Here
|
|---|
|
| 1635 |
", mode=" << txVector.GetMode () << |
1636 |
", mode=" << txVector.GetMode () << |
| 1636 |
", duration=" << hdr->GetDuration () << |
1637 |
", duration=" << hdr->GetDuration () << |
| 1637 |
", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec); |
1638 |
", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec); |
| 1638 |
if (!m_ampdu || hdr->IsRts ()) |
1639 |
NS_LOG_DEBUG ("m_ampdu=" << m_ampdu); |
|
|
1640 |
if (!m_ampdu || hdr->IsRts () || hdr->IsBlockAck ()) |
| 1639 |
{ |
1641 |
{ |
| 1640 |
m_phy->SendPacket (packet, txVector, preamble); |
1642 |
m_phy->SendPacket (packet, txVector, preamble); |
| 1641 |
} |
1643 |
} |
|
Lines 1682-1695
MacLow::ForwardDown (Ptr<const Packet> p
|
Link Here
|
|---|
|
| 1682 |
|
1684 |
|
| 1683 |
listenerIt->second->GetMpduAggregator ()->AddHeaderAndPad (newPacket, last, vhtSingleMpdu); |
1685 |
listenerIt->second->GetMpduAggregator ()->AddHeaderAndPad (newPacket, last, vhtSingleMpdu); |
| 1684 |
|
1686 |
|
| 1685 |
if (hdr->IsBlockAckReq ()) |
1687 |
// if (hdr->IsBlockAckReq ()) |
| 1686 |
{ |
1688 |
// { |
| 1687 |
ampdutag.SetNoOfMpdus (queueSize - 1); |
1689 |
// ampdutag.SetNoOfMpdus (queueSize - 1); |
| 1688 |
} |
1690 |
// } |
| 1689 |
else |
1691 |
// else |
| 1690 |
{ |
1692 |
// { |
| 1691 |
ampdutag.SetNoOfMpdus (queueSize); |
1693 |
ampdutag.SetNoOfMpdus (queueSize); |
| 1692 |
} |
1694 |
// } |
| 1693 |
newPacket->AddPacketTag (ampdutag); |
1695 |
newPacket->AddPacketTag (ampdutag); |
| 1694 |
|
1696 |
|
| 1695 |
if (delay == Seconds (0)) |
1697 |
if (delay == Seconds (0)) |
|
Lines 2894-2899
MacLow::DeaggregateAmpduAndReceive (Ptr<
|
Link Here
|
|---|
|
| 2894 |
bool |
2896 |
bool |
| 2895 |
MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const |
2897 |
MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const |
| 2896 |
{ |
2898 |
{ |
|
|
2899 |
NS_LOG_FUNCTION (this << size); |
| 2897 |
WifiPreamble preamble; |
2900 |
WifiPreamble preamble; |
| 2898 |
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
2901 |
WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
| 2899 |
|
2902 |
|
|
|
| 2948 |
MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr) |
2951 |
MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr) |
| 2949 |
{ |
2952 |
{ |
| 2950 |
NS_ASSERT (m_aggregateQueue->GetSize () == 0); |
2953 |
NS_ASSERT (m_aggregateQueue->GetSize () == 0); |
|
|
2954 |
NS_LOG_FUNCTION (this << packet << hdr); |
| 2951 |
bool isAmpdu = false; |
2955 |
bool isAmpdu = false; |
| 2952 |
Ptr<Packet> newPacket, tempPacket; |
2956 |
Ptr<Packet> newPacket, tempPacket; |
| 2953 |
WifiMacHeader peekedHdr; |
2957 |
WifiMacHeader peekedHdr; |
|
Lines 2965-2972
MacLow::AggregateToAmpdu (Ptr<const Pack
|
Link Here
|
|---|
|
| 2965 |
std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
2969 |
std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
| 2966 |
NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
2970 |
NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
| 2967 |
queue = listenerIt->second->GetQueue (); |
2971 |
queue = listenerIt->second->GetQueue (); |
|
|
2972 |
NS_LOG_DEBUG ("Before-QueueSize=" << queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::ADDR1, hdr.GetAddr1 ())); |
| 2968 |
|
2973 |
|
| 2969 |
if (!hdr.GetAddr1 ().IsBroadcast () && listenerIt->second->GetMpduAggregator () != 0) |
2974 |
if (!hdr.GetAddr1 ().IsBroadcast () |
|
|
2975 |
&& (listenerIt->second->GetMpduAggregator () != 0) |
| 2976 |
&& (queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::ADDR1, hdr.GetAddr1 ()) != 0)) |
| 2970 |
{ |
2977 |
{ |
| 2971 |
//Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager) |
2978 |
//Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager) |
| 2972 |
if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid)) |
2979 |
if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid)) |
|
Lines 3018-3023
MacLow::AggregateToAmpdu (Ptr<const Pack
|
Link Here
|
|---|
|
| 3018 |
Ptr<const Packet> peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, peekedHdr.GetAddr1 (), tid, &tstamp); |
3025 |
Ptr<const Packet> peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, peekedHdr.GetAddr1 (), tid, &tstamp); |
| 3019 |
if (peekedPacket == 0) |
3026 |
if (peekedPacket == 0) |
| 3020 |
{ |
3027 |
{ |
|
|
3028 |
NS_LOG_DEBUG ("PeekedPacket=0"); |
| 3021 |
peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
3029 |
peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
| 3022 |
WifiMacHeader::ADDR1, |
3030 |
WifiMacHeader::ADDR1, |
| 3023 |
hdr.GetAddr1 (), &tstamp); |
3031 |
hdr.GetAddr1 (), &tstamp); |
|
Lines 3035-3044
MacLow::AggregateToAmpdu (Ptr<const Pack
|
Link Here
|
|---|
|
| 3035 |
} |
3043 |
} |
| 3036 |
else |
3044 |
else |
| 3037 |
{ |
3045 |
{ |
|
|
3046 |
NS_LOG_DEBUG ("PeekedPacket!=0"); |
| 3038 |
retry = true; |
3047 |
retry = true; |
| 3039 |
currentSequenceNumber = peekedHdr.GetSequenceNumber (); |
3048 |
currentSequenceNumber = peekedHdr.GetSequenceNumber (); |
| 3040 |
} |
3049 |
} |
| 3041 |
|
3050 |
|
|
|
3051 |
// NS_LOG_DEBUG ("After-QueueSize=" << queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::ADDR1, hdr.GetAddr1 ())); |
| 3052 |
|
| 3042 |
while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize)) |
3053 |
while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize)) |
| 3043 |
{ |
3054 |
{ |
| 3044 |
//for now always send AMPDU with normal ACK |
3055 |
//for now always send AMPDU with normal ACK |
|
Lines 3256-3261
MacLow::InsertInTxQueue (Ptr<const Packe
|
Link Here
|
|---|
|
| 3256 |
Ptr<Packet> |
3267 |
Ptr<Packet> |
| 3257 |
MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize) |
3268 |
MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize) |
| 3258 |
{ |
3269 |
{ |
|
|
3270 |
NS_LOG_FUNCTION (this << packet << hdr << *tstamp << currentAmpduPacket << blockAckSize); |
| 3259 |
bool msduAggregation = false; |
3271 |
bool msduAggregation = false; |
| 3260 |
bool isAmsdu = false; |
3272 |
bool isAmsdu = false; |
| 3261 |
Ptr<Packet> currentAmsduPacket = Create<Packet> (); |
3273 |
Ptr<Packet> currentAmsduPacket = Create<Packet> (); |