src/devices/wifi/mac-low.cc
changeset 5964 8a59a619c30e
parent 5958 dd0accd82659
child 6068 a2127017ecb4
equal deleted inserted replaced
5963:5f82c5a7068e 5964:8a59a619c30e
    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