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; |
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 ¶ms) const; |
495 const MacLowTransmissionParameters ¶ms) 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 */ |