src/devices/wifi/mac-low.h
changeset 6068 a2127017ecb4
parent 6065 0f012e7d9128
parent 5964 8a59a619c30e
child 6273 8d70de29d514
equal deleted inserted replaced
6067:ccbdc2b19ea5 6068:a2127017ecb4
     1 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
     1 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
     2 /*
     2 /*
     3  * Copyright (c) 2005, 2006 INRIA
     3  * Copyright (c) 2005, 2006 INRIA
       
     4  * Copyright (c) 2009 MIRKO BANCHI
     4  *
     5  *
     5  * This program is free software; you can redistribute it and/or modify
     6  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License version 2 as 
     7  * it under the terms of the GNU General Public License version 2 as 
     7  * published by the Free Software Foundation;
     8  * published by the Free Software Foundation;
     8  *
     9  *
    14  * You should have received a copy of the GNU General Public License
    15  * You should have received a copy of the GNU General Public License
    15  * along with this program; if not, write to the Free Software
    16  * along with this program; if not, write to the Free Software
    16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17  *
    18  *
    18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
       
    20  * Author: Mirko Banchi <mk.banchi@gmail.com>
    19  */
    21  */
    20 #ifndef MAC_LOW_H
    22 #ifndef MAC_LOW_H
    21 #define MAC_LOW_H
    23 #define MAC_LOW_H
    22 
    24 
    23 #include <vector>
    25 #include <vector>
    24 #include <stdint.h>
    26 #include <stdint.h>
    25 #include <ostream>
    27 #include <ostream>
       
    28 #include <map>
    26 
    29 
    27 #include "wifi-mac-header.h"
    30 #include "wifi-mac-header.h"
    28 #include "wifi-mode.h"
    31 #include "wifi-mode.h"
    29 #include "wifi-preamble.h"
    32 #include "wifi-preamble.h"
    30 #include "wifi-remote-station-manager.h"
    33 #include "wifi-remote-station-manager.h"
       
    34 #include "ctrl-headers.h"
       
    35 #include "mgt-headers.h"
       
    36 #include "block-ack-agreement.h"
    31 #include "ns3/mac48-address.h"
    37 #include "ns3/mac48-address.h"
    32 #include "ns3/callback.h"
    38 #include "ns3/callback.h"
    33 #include "ns3/event-id.h"
    39 #include "ns3/event-id.h"
    34 #include "ns3/packet.h"
    40 #include "ns3/packet.h"
    35 #include "ns3/nstime.h"
    41 #include "ns3/nstime.h"
       
    42 #include "qos-utils.h"
    36 
    43 
    37 namespace ns3 {
    44 namespace ns3 {
    38 
    45 
    39 class WifiPhy;
    46 class WifiPhy;
    40 class WifiMac;
    47 class WifiMac;
       
    48 class EdcaTxopN;
    41 
    49 
    42 /**
    50 /**
    43  * \brief listen to events coming from ns3::MacLow.
    51  * \brief listen to events coming from ns3::MacLow.
    44  */
    52  */
    45 class MacLowTransmissionListener {
    53 class MacLowTransmissionListener {
    73   /**
    81   /**
    74    * ns3::MacLow did not receive an expected ACK within
    82    * ns3::MacLow did not receive an expected ACK within
    75    * AckTimeout.
    83    * AckTimeout.
    76    */
    84    */
    77   virtual void MissedAck (void) = 0;
    85   virtual void MissedAck (void) = 0;
       
    86   /**
       
    87    * \param blockAck Block ack response header
       
    88    * \param source Address of block ack sender
       
    89    *
       
    90    * Invoked when ns3::MacLow receives a block ack frame.
       
    91    * Block ack frame is received after a block ack request
       
    92    * and contains information about the correct reception 
       
    93    * of a set of packet for which a normal ack wasn't send.
       
    94    * Default implementation for this method is empty. Every
       
    95    * queue that intends to be notified by MacLow of reception
       
    96    * of a block ack must redefine this function.
       
    97    */
       
    98   virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address source);
       
    99   /**
       
   100    * ns3::MacLow did not receive an expected BLOCK_ACK within
       
   101    * BlockAckTimeout. This method is used only for immediate 
       
   102    * block ack variant. With delayed block ack, the MissedAck method will be
       
   103    * called instead: upon receipt of a block ack request, the rx station will
       
   104    * reply with a normal ack frame. Later, when the rx station gets a txop, it
       
   105    * will send the block ack back to the tx station which will reply with a
       
   106    * normal ack to the rx station.
       
   107    */
       
   108   virtual void MissedBlockAck (void);
    78   /**
   109   /**
    79    * Invoked when ns3::MacLow wants to start a new transmission
   110    * Invoked when ns3::MacLow wants to start a new transmission
    80    * as configured by MacLowTransmissionParameters::EnableNextData.
   111    * as configured by MacLowTransmissionParameters::EnableNextData.
    81    * The listener is expected to call again MacLow::StartTransmission
   112    * The listener is expected to call again MacLow::StartTransmission
    82    * with the "next" data to send.
   113    * with the "next" data to send.
   117   virtual void CtsTimeoutStart (Time duration) = 0;
   148   virtual void CtsTimeoutStart (Time duration) = 0;
   118   virtual void CtsTimeoutReset () = 0;
   149   virtual void CtsTimeoutReset () = 0;
   119 };
   150 };
   120 
   151 
   121 /**
   152 /**
       
   153  * \brief listen for block ack events.
       
   154  */
       
   155 class MacLowBlockAckEventListener {
       
   156 public:
       
   157   MacLowBlockAckEventListener ();
       
   158   virtual ~MacLowBlockAckEventListener ();
       
   159   /**
       
   160    * Typically is called in order to notify EdcaTxopN that a block ack inactivity
       
   161    * timeout occurs for the block ack agreement identified by the pair <i>originator</i>, <i>tid</i>.
       
   162    * 
       
   163    * Rx station maintains an inactivity timer for each block ack
       
   164    * agreement. Timer is reset when a frame with ack policy block ack
       
   165    * or a block ack request are received. When this timer reaches zero
       
   166    * this method is called and a delba frame is scheduled for transmission.
       
   167    */
       
   168   virtual void BlockAckInactivityTimeout (Mac48Address originator, uint8_t tid) = 0;
       
   169 };
       
   170 
       
   171 /**
   122  * \brief control how a packet is transmitted.
   172  * \brief control how a packet is transmitted.
   123  *
   173  *
   124  * The ns3::MacLow::StartTransmission method expects
   174  * The ns3::MacLow::StartTransmission method expects
   125  * an instance of this class to describe how the packet
   175  * an instance of this class to describe how the packet
   126  * should be transmitted.
   176  * should be transmitted.
   155    *  - if idle at end-of-tx+PIFS, call
   205    *  - if idle at end-of-tx+PIFS, call
   156    *    MacLowTransmissionListener::MissedAck
   206    *    MacLowTransmissionListener::MissedAck
   157    */
   207    */
   158   void EnableSuperFastAck (void);
   208   void EnableSuperFastAck (void);
   159   /**
   209   /**
       
   210    * Wait BASICBLOCKACKTimeout for a Basic Block Ack Response frame.
       
   211    */
       
   212   void EnableBasicBlockAck (void);
       
   213   /**
       
   214    * Wait COMPRESSEDBLOCKACKTimeout for a Compressed Block Ack Response frame.
       
   215    */
       
   216   void EnableCompressedBlockAck (void);
       
   217   /**
       
   218    * NOT IMPLEMENTED FOR NOW
       
   219    */
       
   220   void EnableMultiTidBlockAck (void);
       
   221   /**
   160    * Send a RTS, and wait CTSTimeout for a CTS. If we get a 
   222    * Send a RTS, and wait CTSTimeout for a CTS. If we get a 
   161    * CTS on time, call MacLowTransmissionListener::GotCts
   223    * CTS on time, call MacLowTransmissionListener::GotCts
   162    * and send data. Otherwise, call MacLowTransmissionListener::MissedCts
   224    * and send data. Otherwise, call MacLowTransmissionListener::MissedCts
   163    * and do not send data.
   225    * and do not send data.
   164    */
   226    */
   230    *          otherwise.
   292    *          otherwise.
   231    *
   293    *
   232    * \sa EnableSuperFastAck
   294    * \sa EnableSuperFastAck
   233    */
   295    */
   234   bool MustWaitSuperFastAck (void) const;
   296   bool MustWaitSuperFastAck (void) const;
       
   297   /**
       
   298    * \returns true if block ack mechanism is used, false otherwise.
       
   299    *
       
   300    * \sa EnableBlockAck
       
   301    */
       
   302   bool MustWaitBasicBlockAck (void) const;
       
   303   /**
       
   304    * \returns true if compressed block ack mechanism is used, false otherwise.
       
   305    *
       
   306    * \sa EnableCompressedBlockAck
       
   307    */
       
   308   bool MustWaitCompressedBlockAck (void) const;
       
   309   /**
       
   310    * \returns true if multi-tid block ack mechanism is used, false otherwise.
       
   311    *
       
   312    * \sa EnableMultiTidBlockAck
       
   313    */
       
   314   bool MustWaitMultiTidBlockAck (void) const;
   235   /**
   315   /**
   236    * \returns true if RTS should be sent and CTS waited for before 
   316    * \returns true if RTS should be sent and CTS waited for before 
   237    *          sending data, false otherwise.
   317    *          sending data, false otherwise.
   238    */
   318    */
   239   bool MustSendRts (void) const;
   319   bool MustSendRts (void) const;
   260   uint32_t m_nextSize;
   340   uint32_t m_nextSize;
   261   enum {
   341   enum {
   262     ACK_NONE,
   342     ACK_NONE,
   263     ACK_NORMAL,
   343     ACK_NORMAL,
   264     ACK_FAST,
   344     ACK_FAST,
   265     ACK_SUPER_FAST
   345     ACK_SUPER_FAST,
       
   346     BLOCK_ACK_BASIC,
       
   347     BLOCK_ACK_COMPRESSED,
       
   348     BLOCK_ACK_MULTI_TID
   266   } m_waitAck;
   349   } m_waitAck;
   267   bool m_sendRts;
   350   bool m_sendRts;
   268   Time m_overrideDurationId;
   351   Time m_overrideDurationId;
   269 };
   352 };
   270 
   353 
   284   void SetPhy (Ptr<WifiPhy> phy);
   367   void SetPhy (Ptr<WifiPhy> phy);
   285   void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager);
   368   void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager);
   286 
   369 
   287   void SetAddress (Mac48Address ad);
   370   void SetAddress (Mac48Address ad);
   288   void SetAckTimeout (Time ackTimeout);
   371   void SetAckTimeout (Time ackTimeout);
       
   372   void SetBasicBlockAckTimeout (Time blockAckTimeout);
       
   373   void SetCompressedBlockAckTimeout (Time blockAckTimeout);
   289   void SetCtsTimeout (Time ctsTimeout);
   374   void SetCtsTimeout (Time ctsTimeout);
   290   void SetSifs (Time sifs);
   375   void SetSifs (Time sifs);
   291   void SetSlotTime (Time slotTime);
   376   void SetSlotTime (Time slotTime);
   292   void SetPifs (Time pifs);
   377   void SetPifs (Time pifs);
   293   void SetBssid (Mac48Address ad);
   378   void SetBssid (Mac48Address ad);
   294   Mac48Address GetAddress (void) const;
   379   Mac48Address GetAddress (void) const;
   295   Time GetAckTimeout (void) const;
   380   Time GetAckTimeout (void) const;
       
   381   Time GetBasicBlockAckTimeout () const;
       
   382   Time GetCompressedBlockAckTimeout () const;
   296   Time GetCtsTimeout (void) const;
   383   Time GetCtsTimeout (void) const;
   297   Time GetSifs (void) const;
   384   Time GetSifs (void) const;
   298   Time GetSlotTime (void) const;
   385   Time GetSlotTime (void) const;
   299   Time GetPifs (void) const;
   386   Time GetPifs (void) const;
   300   Mac48Address GetBssid (void) const;
   387   Mac48Address GetBssid (void) const;
   362    * This method is typically invoked by the PhyMacLowListener to notify
   449    * This method is typically invoked by the PhyMacLowListener to notify
   363    * the MAC layer that a channel switching occured. When a channel switching
   450    * the MAC layer that a channel switching occured. When a channel switching
   364    * occurs, pending MAC transmissions (RTS, CTS, DATA and ACK) are cancelled.
   451    * occurs, pending MAC transmissions (RTS, CTS, DATA and ACK) are cancelled.
   365    */
   452    */
   366   void NotifySwitchingStartNow (Time duration); 
   453   void NotifySwitchingStartNow (Time duration); 
       
   454   /**
       
   455    * \param respHdr Add block ack response from originator (action frame).
       
   456    * \param originator Address of peer station involved in block ack mechanism.
       
   457    * \param startingSeq Sequence number of the first MPDU of all packets for which block ack was negotiated.
       
   458    * 
       
   459    * This function is typically invoked only by ns3::QapWifiMac and ns3::QstaWifiMac.
       
   460    * If we are transmitting an Add block ack response, MacLow must allocate buffers to collect
       
   461    * all correctly received packets belonging to category for which block ack was negotiated.
       
   462    * It's needed in order to send a Block ack after corresponding originator's Block ack request.
       
   463    */
       
   464   void CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator,
       
   465                                 uint16_t startingSeq);
       
   466   /**
       
   467    * \param originator Address of peer partecipating in Block Ack mechanism.
       
   468    * \param tid TID for which Block Ack was created.
       
   469    *
       
   470    * Checks if exists an established block ack agreement with <i>originator</i>
       
   471    * for tid <i>tid</i>. If the agreement exists, tears down it. This function is typically
       
   472    * invoked when a DELBA frame is received from <i>originator</i>.
       
   473    */
       
   474   void DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid);
       
   475   /**
       
   476    * \param ac Access class managed by the queue.
       
   477    * \param listener The listener for the queue.
       
   478    *
       
   479    * The lifetime of the registered listener is typically equal to the lifetime of the queue
       
   480    * associated to this AC.
       
   481    */
       
   482   void RegisterBlockAckListenerForAc (enum AccessClass ac, MacLowBlockAckEventListener *listener);
   367 private:
   483 private:
   368   void CancelAllEvents (void);
   484   void CancelAllEvents (void);
   369   uint32_t GetAckSize (void) const;
   485   uint32_t GetAckSize (void) const;
       
   486   uint32_t GetBlockAckSize (enum BlockAckType type) const;
   370   uint32_t GetRtsSize (void) const;
   487   uint32_t GetRtsSize (void) const;
   371   uint32_t GetCtsSize (void) const;
   488   uint32_t GetCtsSize (void) const;
   372   uint32_t GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   489   uint32_t GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   373   Time NowUs (void) const;
   490   Time NowUs (void) const;
   374   void ForwardDown (Ptr<const Packet> packet, const WifiMacHeader *hdr, 
   491   void ForwardDown (Ptr<const Packet> packet, const WifiMacHeader *hdr, 
   378                                const MacLowTransmissionParameters &params) const;
   495                                const MacLowTransmissionParameters &params) const;
   379   WifiMode GetRtsTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   496   WifiMode GetRtsTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   380   WifiMode GetDataTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   497   WifiMode GetDataTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
   381   WifiMode GetCtsTxModeForRts (Mac48Address to, WifiMode rtsTxMode) const;
   498   WifiMode GetCtsTxModeForRts (Mac48Address to, WifiMode rtsTxMode) const;
   382   WifiMode GetAckTxModeForData (Mac48Address to, WifiMode dataTxMode) const;
   499   WifiMode GetAckTxModeForData (Mac48Address to, WifiMode dataTxMode) const;
       
   500 
   383   Time GetCtsDuration (Mac48Address to, WifiMode rtsTxMode) const;
   501   Time GetCtsDuration (Mac48Address to, WifiMode rtsTxMode) const;
   384   Time GetAckDuration (Mac48Address to, WifiMode dataTxMode) const;
   502   Time GetAckDuration (Mac48Address to, WifiMode dataTxMode) const;
       
   503   Time GetBlockAckDuration (Mac48Address to, WifiMode blockAckReqTxMode, enum BlockAckType type) const;
   385   void NotifyNav (const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble);
   504   void NotifyNav (const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble);
   386   void DoNavResetNow (Time duration);
   505   void DoNavResetNow (Time duration);
   387   bool DoNavStartNow (Time duration);
   506   bool DoNavStartNow (Time duration);
   388   bool IsNavZero (void) const;
   507   bool IsNavZero (void) const;
   389   void NotifyAckTimeoutStartNow (Time duration);
   508   void NotifyAckTimeoutStartNow (Time duration);
   395   void NavCounterResetCtsMissed (Time rtsEndRxTime);
   514   void NavCounterResetCtsMissed (Time rtsEndRxTime);
   396   void NormalAckTimeout (void);
   515   void NormalAckTimeout (void);
   397   void FastAckTimeout (void);
   516   void FastAckTimeout (void);
   398   void SuperFastAckTimeout (void);
   517   void SuperFastAckTimeout (void);
   399   void FastAckFailedTimeout (void);
   518   void FastAckFailedTimeout (void);
       
   519   void BlockAckTimeout (void);
   400   void CtsTimeout (void);
   520   void CtsTimeout (void);
   401   void SendCtsAfterRts (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
   521   void SendCtsAfterRts (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
   402   void SendAckAfterData (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
   522   void SendAckAfterData (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
   403   void SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode);
   523   void SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode);
   404   void WaitSifsAfterEndTx (void);
   524   void WaitSifsAfterEndTx (void);
   406   void SendRtsForPacket (void);
   526   void SendRtsForPacket (void);
   407   void SendDataPacket (void);
   527   void SendDataPacket (void);
   408   void SendCurrentTxPacket (void);
   528   void SendCurrentTxPacket (void);
   409   void StartDataTxTimers (void);
   529   void StartDataTxTimers (void);
   410   virtual void DoDispose (void);
   530   virtual void DoDispose (void);
       
   531   /**
       
   532    * \param originator Address of peer partecipating in Block Ack mechanism.
       
   533    * \param tid TID for which Block Ack was created.
       
   534    * \param seq Starting sequence
       
   535    *
       
   536    * This function forward up all completed "old" packets with sequence number
       
   537    * smaller than <i>seq</i>. All comparison are performed circularly mod 4096.
       
   538    */
       
   539   void RxCompleteBufferedPacketsWithSmallerSequence (uint16_t seq, Mac48Address originator, uint8_t tid);
       
   540   /**
       
   541    * \param originator Address of peer partecipating in Block Ack mechanism.
       
   542    * \param tid TID for which Block Ack was created.
       
   543    *
       
   544    * This method is typically invoked when a MPDU with ack policy
       
   545    * subfield set to Normal Ack is received and a block ack agreement
       
   546    * for that packet exists.
       
   547    * This happens when the originator of block ack has only few MPDUs to send.
       
   548    * All completed MSDUs starting with starting sequence number of block ack
       
   549    * agreement are forward up to WifiMac until there is an incomplete MSDU.
       
   550    * See section 9.10.4 in IEEE802.11 standard for more details.
       
   551    */
       
   552   void RxCompleteBufferedPackets (Mac48Address originator, uint8_t tid);
       
   553   /* 
       
   554    * This method checks if exists a valid established block ack agreement. 
       
   555    * If there is, store the packet without pass it up to WifiMac. The packet is buffered
       
   556    * in order of increasing sequence control field. All comparison are performed
       
   557    * circularly modulo 2^12.
       
   558    */
       
   559   bool StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr);
       
   560   /*
       
   561    * Invoked after that a block ack request has been received. Looks for corresponding
       
   562    * block ack agreement and creates block ack bitmap on a received packets basis.
       
   563    */
       
   564   void SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Mac48Address originator,
       
   565                                          Time duration, WifiMode blockAckReqTxMode);
       
   566   /*
       
   567    * This method creates block ack frame with header equals to <i>blockAck</i> and start its transmission.
       
   568    */
       
   569   void SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Address originator, bool immediate,
       
   570                              Time duration, WifiMode blockAckReqTxMode);
       
   571   /*
       
   572    * Every time that a block ack request or a packet with ack policy equals to <i>block ack</i>
       
   573    * are received, if a relative block ack agreement exists and the value of inactivity timeout
       
   574    * is not 0, the timer is reset.
       
   575    * see section 11.5.3 in IEEE802.11e for more details.
       
   576    */
       
   577   void ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement);
   411 
   578 
   412   void SetupPhyMacLowListener (Ptr<WifiPhy> phy); 
   579   void SetupPhyMacLowListener (Ptr<WifiPhy> phy); 
   413 
   580 
   414   Ptr<WifiPhy> m_phy;
   581   Ptr<WifiPhy> m_phy;
   415   Ptr<WifiRemoteStationManager> m_stationManager;
   582   Ptr<WifiRemoteStationManager> m_stationManager;
   420 
   587 
   421   EventId m_normalAckTimeoutEvent;
   588   EventId m_normalAckTimeoutEvent;
   422   EventId m_fastAckTimeoutEvent;
   589   EventId m_fastAckTimeoutEvent;
   423   EventId m_superFastAckTimeoutEvent;
   590   EventId m_superFastAckTimeoutEvent;
   424   EventId m_fastAckFailedTimeoutEvent;
   591   EventId m_fastAckFailedTimeoutEvent;
       
   592   EventId m_blockAckTimeoutEvent;
   425   EventId m_ctsTimeoutEvent;
   593   EventId m_ctsTimeoutEvent;
   426   EventId m_sendCtsEvent;
   594   EventId m_sendCtsEvent;
   427   EventId m_sendAckEvent;
   595   EventId m_sendAckEvent;
   428   EventId m_sendDataEvent;
   596   EventId m_sendDataEvent;
   429   EventId m_waitSifsEvent;
   597   EventId m_waitSifsEvent;
   434   MacLowTransmissionParameters m_txParams;
   602   MacLowTransmissionParameters m_txParams;
   435   MacLowTransmissionListener *m_listener;
   603   MacLowTransmissionListener *m_listener;
   436   Mac48Address m_self;
   604   Mac48Address m_self;
   437   Mac48Address m_bssid;
   605   Mac48Address m_bssid;
   438   Time m_ackTimeout;
   606   Time m_ackTimeout;
       
   607   Time m_basicBlockAckTimeout;
       
   608   Time m_compressedBlockAckTimeout;
   439   Time m_ctsTimeout;
   609   Time m_ctsTimeout;
   440   Time m_sifs;
   610   Time m_sifs;
   441   Time m_slotTime;
   611   Time m_slotTime;
   442   Time m_pifs;
   612   Time m_pifs;
   443 
   613 
   444   Time m_lastNavStart;
   614   Time m_lastNavStart;
   445   Time m_lastNavDuration;
   615   Time m_lastNavDuration;
   446 
   616 
   447   // Listerner needed to monitor when a channel switching occurs. 
   617   // Listerner needed to monitor when a channel switching occurs. 
   448   class PhyMacLowListener *m_phyMacLowListener; 
   618   class PhyMacLowListener *m_phyMacLowListener; 
       
   619 
       
   620   /*
       
   621    * BlockAck data structures.
       
   622    */
       
   623   typedef std::pair<Ptr<Packet>, WifiMacHeader> BufferedPacket;
       
   624   typedef std::list<BufferedPacket>::iterator BufferedPacketI;
       
   625 
       
   626   typedef std::pair<Mac48Address, uint8_t> AgreementKey;
       
   627   typedef std::pair<BlockAckAgreement, std::list<BufferedPacket> > AgreementValue;
       
   628 
       
   629   typedef std::map<AgreementKey, AgreementValue> Agreements;
       
   630   typedef std::map<AgreementKey, AgreementValue>::iterator AgreementsI;
       
   631 
       
   632   Agreements m_bAckAgreements;
       
   633   
       
   634   typedef std::map<AccessClass, MacLowBlockAckEventListener*> QueueListeners;
       
   635   QueueListeners m_edcaListeners;
   449 };
   636 };
   450 
   637 
   451 } // namespace ns3
   638 } // namespace ns3
   452 
   639 
   453 #endif /* MAC_LOW_H */
   640 #endif /* MAC_LOW_H */