29 |
29 |
30 #include "mac-low.h" |
30 #include "mac-low.h" |
31 #include "wifi-phy.h" |
31 #include "wifi-phy.h" |
32 #include "wifi-mac-trailer.h" |
32 #include "wifi-mac-trailer.h" |
33 #include "qos-utils.h" |
33 #include "qos-utils.h" |
|
34 #include "edca-txop-n.h" |
34 |
35 |
35 NS_LOG_COMPONENT_DEFINE ("MacLow"); |
36 NS_LOG_COMPONENT_DEFINE ("MacLow"); |
36 |
37 |
37 #undef NS_LOG_APPEND_CONTEXT |
38 #undef NS_LOG_APPEND_CONTEXT |
38 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] " |
39 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] " |
121 MacLowTransmissionListener::MissedBlockAck (void) |
122 MacLowTransmissionListener::MissedBlockAck (void) |
122 {} |
123 {} |
123 MacLowDcfListener::MacLowDcfListener () |
124 MacLowDcfListener::MacLowDcfListener () |
124 {} |
125 {} |
125 MacLowDcfListener::~MacLowDcfListener () |
126 MacLowDcfListener::~MacLowDcfListener () |
|
127 {} |
|
128 |
|
129 MacLowBlockAckEventListener::MacLowBlockAckEventListener () |
|
130 {} |
|
131 MacLowBlockAckEventListener::~MacLowBlockAckEventListener () |
126 {} |
132 {} |
127 |
133 |
128 MacLowTransmissionParameters::MacLowTransmissionParameters () |
134 MacLowTransmissionParameters::MacLowTransmissionParameters () |
129 : m_nextSize (0), |
135 : m_nextSize (0), |
130 m_waitAck (ACK_NONE), |
136 m_waitAck (ACK_NONE), |
743 { |
749 { |
744 AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), blockAckReq.GetTidInfo ())); |
750 AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), blockAckReq.GetTidInfo ())); |
745 if (it != m_bAckAgreements.end ()) |
751 if (it != m_bAckAgreements.end ()) |
746 { |
752 { |
747 NS_ASSERT (m_sendAckEvent.IsExpired ()); |
753 NS_ASSERT (m_sendAckEvent.IsExpired ()); |
|
754 /* See section 11.5.3 in IEEE802.11 for mean of this timer */ |
|
755 ResetBlockAckInactivityTimerIfNeeded (it->second.first); |
748 if ((*it).second.first.IsImmediateBlockAck ()) |
756 if ((*it).second.first.IsImmediateBlockAck ()) |
749 { |
757 { |
750 NS_LOG_DEBUG ("rx blockAckRequest/sendImmediateBlockAck from="<< hdr.GetAddr2 ()); |
758 NS_LOG_DEBUG ("rx blockAckRequest/sendImmediateBlockAck from="<< hdr.GetAddr2 ()); |
751 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
759 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
752 &MacLow::SendBlockAckAfterBlockAckRequest, this, |
760 &MacLow::SendBlockAckAfterBlockAckRequest, this, |
798 hdr.GetAddr2 (), |
806 hdr.GetAddr2 (), |
799 hdr.GetDuration (), |
807 hdr.GetDuration (), |
800 txMode, |
808 txMode, |
801 rxSnr); |
809 rxSnr); |
802 } |
810 } |
|
811 else if (hdr.IsQosBlockAck ()) |
|
812 { |
|
813 AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ())); |
|
814 /* See section 11.5.3 in IEEE802.11 for mean of this timer */ |
|
815 ResetBlockAckInactivityTimerIfNeeded (it->second.first); |
|
816 } |
803 return; |
817 return; |
804 } |
818 } |
805 else if (hdr.IsQosData () && hdr.IsQosBlockAck ()) |
819 else if (hdr.IsQosData () && hdr.IsQosBlockAck ()) |
806 { |
820 { |
807 /* This happens if a packet with ack policy Block Ack is received and a block ack |
821 /* This happens if a packet with ack policy Block Ack is received and a block ack |
808 agreement for that packet doesn't exist. |
822 agreement for that packet doesn't exist. |
809 |
823 |
810 From section 11.5.3 in IEEE802.11e: |
824 From section 11.5.3 in IEEE802.11e: |
811 When a recipient does not have an active Block ack for a TID, but receives |
825 When a recipient does not have an active Block ack for a TID, but receives |
812 data MPDUs with the Ack Policy subfield set to Block Ack, it shall discard |
826 data MPDUs with the Ack Policy subfield set to Block Ack, it shall discard |
813 them [...]. */ |
827 them and shall send a DELBA frame using the normal access |
|
828 mechanisms. */ |
|
829 AccessClass ac = QosUtilsMapTidToAc (hdr.GetQosTid ()); |
|
830 m_edcaListeners[ac]->BlockAckInactivityTimeout (hdr.GetAddr2 (), hdr.GetQosTid ()); |
814 return; |
831 return; |
815 } |
832 } |
816 else if (hdr.IsQosData () && hdr.IsQosNoAck ()) |
833 else if (hdr.IsQosData () && hdr.IsQosNoAck ()) |
817 { |
834 { |
818 NS_LOG_DEBUG ("rx unicast/noAck from="<<hdr.GetAddr2 ()); |
835 NS_LOG_DEBUG ("rx unicast/noAck from="<<hdr.GetAddr2 ()); |
1502 |
1519 |
1503 void |
1520 void |
1504 MacLow::CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator, |
1521 MacLow::CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator, |
1505 uint16_t startingSeq) |
1522 uint16_t startingSeq) |
1506 { |
1523 { |
1507 BlockAckAgreement agreement (originator, respHdr->GetTid ()); |
1524 uint8_t tid = respHdr->GetTid (); |
|
1525 BlockAckAgreement agreement (originator, tid); |
1508 if (respHdr->IsImmediateBlockAck ()) |
1526 if (respHdr->IsImmediateBlockAck ()) |
1509 { |
1527 { |
1510 agreement.SetImmediateBlockAck (); |
1528 agreement.SetImmediateBlockAck (); |
1511 } |
1529 } |
1512 else |
1530 else |
1520 |
1538 |
1521 std::list<BufferedPacket> buffer (0); |
1539 std::list<BufferedPacket> buffer (0); |
1522 AgreementKey key (originator, respHdr->GetTid ()); |
1540 AgreementKey key (originator, respHdr->GetTid ()); |
1523 AgreementValue value (agreement, buffer); |
1541 AgreementValue value (agreement, buffer); |
1524 m_bAckAgreements.insert (std::make_pair (key, value)); |
1542 m_bAckAgreements.insert (std::make_pair (key, value)); |
|
1543 |
|
1544 if (respHdr->GetTimeout () != 0) |
|
1545 { |
|
1546 AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, respHdr->GetTid ())); |
|
1547 Time timeout = MicroSeconds (1024 * agreement.GetTimeout ()); |
|
1548 |
|
1549 AccessClass ac = QosUtilsMapTidToAc (agreement.GetTid ()); |
|
1550 |
|
1551 it->second.first.m_inactivityEvent = Simulator::Schedule (timeout, |
|
1552 &MacLowBlockAckEventListener::BlockAckInactivityTimeout, |
|
1553 m_edcaListeners[ac], |
|
1554 originator, tid); |
|
1555 } |
1525 } |
1556 } |
1526 |
1557 |
1527 void |
1558 void |
1528 MacLow::DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid) |
1559 MacLow::DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid) |
1529 { |
1560 { |
1796 } |
1827 } |
1797 |
1828 |
1798 SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxMode); |
1829 SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxMode); |
1799 } |
1830 } |
1800 |
1831 |
|
1832 void |
|
1833 MacLow::ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement) |
|
1834 { |
|
1835 if (agreement.GetTimeout () != 0) |
|
1836 { |
|
1837 NS_ASSERT (agreement.m_inactivityEvent.IsRunning ()); |
|
1838 agreement.m_inactivityEvent.Cancel (); |
|
1839 Time timeout = MicroSeconds (1024 * agreement.GetTimeout ()); |
|
1840 |
|
1841 AccessClass ac = QosUtilsMapTidToAc (agreement.GetTid ()); |
|
1842 //std::map<AccessClass, MacLowTransmissionListener*>::iterator it = m_edcaListeners.find (ac); |
|
1843 //NS_ASSERT (it != m_edcaListeners.end ()); |
|
1844 |
|
1845 agreement.m_inactivityEvent = Simulator::Schedule (timeout, |
|
1846 &MacLowBlockAckEventListener::BlockAckInactivityTimeout, |
|
1847 m_edcaListeners[ac], |
|
1848 agreement.GetPeer (), |
|
1849 agreement.GetTid ()); |
|
1850 } |
|
1851 } |
|
1852 |
|
1853 void |
|
1854 MacLow::RegisterBlockAckListenerForAc (enum AccessClass ac, MacLowBlockAckEventListener *listener) |
|
1855 { |
|
1856 m_edcaListeners.insert (std::make_pair (ac, listener)); |
|
1857 } |
|
1858 |
1801 } // namespace ns3 |
1859 } // namespace ns3 |