A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
block-ack-manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009, 2010 MIRKO BANCHI
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Mirko Banchi <mk.banchi@gmail.com>
7 */
8
9#ifndef BLOCK_ACK_MANAGER_H
10#define BLOCK_ACK_MANAGER_H
11
12#include "block-ack-type.h"
15#include "wifi-mac-header.h"
16#include "wifi-mpdu.h"
17#include "wifi-tx-vector.h"
18
19#include "ns3/nstime.h"
20#include "ns3/object.h"
21#include "ns3/traced-callback.h"
22
23#include <map>
24#include <optional>
25
26namespace ns3
27{
28
29class MgtAddBaResponseHeader;
30class MgtAddBaRequestHeader;
31class CtrlBAckResponseHeader;
32class CtrlBAckRequestHeader;
33class WifiMacQueue;
34class MacRxMiddle;
35
36/**
37 * @brief Manages all block ack agreements for an originator station.
38 * @ingroup wifi
39 */
40class BlockAckManager : public Object
41{
42 private:
43 /**
44 * Enumeration for the statuses of a buffered MPDU
45 */
52
53 public:
54 /**
55 * @brief Get the type ID.
56 * @return the object TypeId
57 */
58 static TypeId GetTypeId();
59
61 ~BlockAckManager() override;
62
63 // Delete copy constructor and assignment operator to avoid misuse
66
67 /// optional const reference to OriginatorBlockAckAgreement
69 std::optional<std::reference_wrapper<const OriginatorBlockAckAgreement>>;
70 /// optional const reference to RecipientBlockAckAgreement
72 std::optional<std::reference_wrapper<const RecipientBlockAckAgreement>>;
73
74 /**
75 * @param recipient MAC address of the recipient
76 * @param tid Traffic ID
77 *
78 * @return a const reference to the block ack agreement with the given recipient, if it exists
79 *
80 * Check if we are the originator of an existing block ack agreement with the given recipient.
81 */
83 uint8_t tid) const;
84 /**
85 * @param originator MAC address of the originator
86 * @param tid Traffic ID
87 *
88 * @return a const reference to the block ack agreement with the given originator, if it exists
89 *
90 * Check if we are the recipient of an existing block ack agreement with the given originator.
91 */
93 uint8_t tid) const;
94
95 /**
96 * @param reqHdr Relative Add block ack request (action frame).
97 * @param recipient Address of peer station involved in block ack mechanism.
98 *
99 * Creates a new originator block ack agreement in pending state. When a ADDBA response
100 * with a successful status code is received, the relative agreement becomes established.
101 */
103 const Mac48Address& recipient);
104 /**
105 * @param recipient Address of peer station involved in block ack mechanism.
106 * @param tid traffic ID of transmitted packet.
107 *
108 * Invoked when a recipient reject a block ack agreement or when a DELBA frame
109 * is Received/Transmitted.
110 */
111 void DestroyOriginatorAgreement(const Mac48Address& recipient, uint8_t tid);
112 /**
113 * @param respHdr Relative Add block ack response (action frame).
114 * @param recipient Address of peer station involved in block ack mechanism.
115 * @param startingSeq the updated starting sequence number
116 *
117 * Invoked upon receipt of a ADDBA response frame from <i>recipient</i>.
118 */
120 const Mac48Address& recipient,
121 uint16_t startingSeq);
122
123 /**
124 * @param respHdr Add block ack response from originator (action
125 * frame).
126 * @param originator Address of peer station involved in block ack
127 * mechanism.
128 * @param startingSeq Sequence number of the first MPDU of all
129 * packets for which block ack was negotiated.
130 * @param rxMiddle the MAC RX Middle on this station
131 *
132 * This function is typically invoked only by ns3::WifiMac
133 * when the STA (which may be non-AP in ESS, or in an IBSS) has
134 * received an ADDBA Request frame and is transmitting an ADDBA
135 * Response frame. At this point the frame exchange manager must
136 * allocate buffers to collect all correctly received packets belonging
137 * to the category for which block ack was negotiated.
138 */
140 const Mac48Address& originator,
141 uint16_t startingSeq,
142 Ptr<MacRxMiddle> rxMiddle);
143 /**
144 * Destroy a recipient Block Ack agreement.
145 *
146 * @param originator the originator MAC address
147 * @param tid the TID associated with the Block Ack agreement
148 */
149 void DestroyRecipientAgreement(const Mac48Address& originator, uint8_t tid);
150
151 /**
152 * @param mpdu MPDU to store.
153 *
154 * Stores <i>mpdu</i> for a possible future retransmission. Retransmission occurs
155 * if the packet, in a BlockAck frame, is indicated by recipient as not received.
156 */
157 void StorePacket(Ptr<WifiMpdu> mpdu);
158 /**
159 * Invoked upon receipt of an Ack frame on the given link after the transmission of a
160 * QoS data frame sent under an established block ack agreement. Remove the acknowledged
161 * frame from the outstanding packets and update the starting sequence number of the
162 * transmit window, if needed.
163 *
164 * @param linkId the ID of the given link
165 * @param mpdu The acknowledged MPDU.
166 */
167 void NotifyGotAck(uint8_t linkId, Ptr<const WifiMpdu> mpdu);
168 /**
169 * Invoked upon missed reception of an Ack frame on the given link after the
170 * transmission of a QoS data frame sent under an established block ack agreement.
171 * Remove the acknowledged frame from the outstanding packets and insert it in the
172 * retransmission queue.
173 *
174 * @param linkId the ID of the given link
175 * @param mpdu The unacknowledged MPDU.
176 */
177 void NotifyMissedAck(uint8_t linkId, Ptr<WifiMpdu> mpdu);
178 /**
179 * @param linkId the ID of the given link
180 * @param blockAck The received BlockAck frame.
181 * @param recipient Sender of BlockAck frame.
182 * @param tids the set of TIDs the acknowledged MPDUs belong to
183 * @param index the index of the Per AID TID Info subfield, in case of Multi-STA
184 * Block Ack, or 0, otherwise
185 * @return a pair of values indicating the number of successfully received MPDUs
186 * and the number of failed MPDUs
187 *
188 * Invoked upon receipt of a BlockAck frame on the given link. Typically, this function
189 * is called by ns3::QosTxop object. Performs a check on which MPDUs, previously sent
190 * with Ack Policy set to Block Ack, were correctly received by the recipient.
191 * An acknowledged MPDU is removed from the buffer, retransmitted otherwise.
192 * Note that <i>tids</i> is only used if <i>blockAck</i> is a Multi-STA Block Ack
193 * using All-ack context.
194 */
195 std::pair<uint16_t, uint16_t> NotifyGotBlockAck(uint8_t linkId,
196 const CtrlBAckResponseHeader& blockAck,
197 const Mac48Address& recipient,
198 const std::set<uint8_t>& tids,
199 size_t index = 0);
200 /**
201 * @param linkId the ID of the given link
202 * @param recipient Sender of the expected BlockAck frame.
203 * @param tid Traffic ID.
204 *
205 * Invoked upon missed reception of a block ack frame on the given link. Typically, this
206 * function is called by ns3::QosTxop object. Performs a check on which MPDUs, previously
207 * sent with ack policy set to Block Ack, should be placed in the retransmission queue.
208 */
209 void NotifyMissedBlockAck(uint8_t linkId, const Mac48Address& recipient, uint8_t tid);
210 /**
211 * @param originator MAC address of the sender of the Block Ack Request
212 * @param tid Traffic ID
213 * @param startingSeq the starting sequence number in the Block Ack Request
214 *
215 * Perform required actions upon receiving a Block Ack Request frame.
216 */
217 void NotifyGotBlockAckRequest(const Mac48Address& originator,
218 uint8_t tid,
219 uint16_t startingSeq);
220 /**
221 * @param mpdu the received MPDU
222 *
223 * Perform required actions upon receiving an MPDU.
224 */
226 /**
227 * @param recipient Address of peer station involved in block ack mechanism.
228 * @param tid Traffic ID.
229 *
230 * @return the number of packets buffered for a specified agreement
231 *
232 * Returns the number of packets buffered for a specified agreement. This methods doesn't return
233 * the number of buffered MPDUs but the number of buffered MSDUs.
234 */
235 uint32_t GetNBufferedPackets(const Mac48Address& recipient, uint8_t tid) const;
236 /**
237 * @param recipient Address of peer station involved in block ack mechanism.
238 * @param tid Traffic ID of transmitted packet.
239 *
240 * Marks an originator agreement as rejected. This happens if <i>recipient</i> station reject
241 * block ack setup by an ADDBA Response frame with a failure status code. For now we assume
242 * that every QoS station accepts a block ack setup.
243 */
244 void NotifyOriginatorAgreementRejected(const Mac48Address& recipient, uint8_t tid);
245 /**
246 * @param recipient Address of peer station involved in block ack mechanism.
247 * @param tid Traffic ID of transmitted packet.
248 *
249 * Marks an originator agreement after not receiving response to ADDBA request. During this
250 * state any packets in queue will be transmitted using normal MPDU. This also unblocks
251 * recipient address.
252 */
253 void NotifyOriginatorAgreementNoReply(const Mac48Address& recipient, uint8_t tid);
254 /**
255 * @param recipient Address of peer station involved in block ack mechanism.
256 * @param tid Traffic ID of transmitted packet.
257 *
258 * Set Originator BA agreement to a transitory state to reset it after not receiving response
259 * to ADDBA request.
260 */
261 void NotifyOriginatorAgreementReset(const Mac48Address& recipient, uint8_t tid);
262 /**
263 * @param nPackets Minimum number of packets for use of block ack.
264 *
265 * Upon receipt of a BlockAck frame, if total number of packets (packets in WifiMacQueue
266 * and buffered packets) is greater of <i>nPackets</i>, they are transmitted using block ack
267 * mechanism.
268 */
269 void SetBlockAckThreshold(uint8_t nPackets);
270
271 /**
272 * @param queue The WifiMacQueue object.
273 */
274 void SetQueue(const Ptr<WifiMacQueue> queue);
275
276 /**
277 * Set block ack inactivity callback
278 * @param callback the block ack inactivity callback function
279 */
281 /**
282 * Set block destination callback
283 * @param callback the block destination callback
284 */
286 /**
287 * Set unblock destination callback
288 * @param callback the unblock destination callback
289 */
291
292 /**
293 * This function returns true if a block ack agreement is established with the
294 * given recipient for the given TID and there is at least an outstanding MPDU
295 * for such agreement whose lifetime is not expired.
296 *
297 * @param tid Traffic ID
298 * @param recipient MAC address of the recipient
299 *
300 * @returns true if BAR retransmission needed
301 */
302 bool NeedBarRetransmission(uint8_t tid, const Mac48Address& recipient);
303 /**
304 * This function returns the buffer size negotiated with the recipient.
305 *
306 * @param tid Traffic ID
307 * @param recipient MAC address of the recipient
308 *
309 * @returns the buffer size negotiated with the recipient
310 */
311 uint16_t GetRecipientBufferSize(const Mac48Address& recipient, uint8_t tid) const;
312 /**
313 * This function returns the starting sequence number of the transmit window.
314 *
315 * @param tid Traffic ID
316 * @param recipient MAC address of the recipient
317 *
318 * @returns the starting sequence number of the transmit window (WinStartO)
319 */
320 uint16_t GetOriginatorStartingSequence(const Mac48Address& recipient, uint8_t tid) const;
321
322 /**
323 * typedef for a callback to invoke when an MPDU is successfully ack'ed.
324 */
326 /**
327 * typedef for a callback to invoke when an MPDU is negatively ack'ed.
328 */
330 /**
331 * typedef for a callback to invoke when an MPDU is dropped.
332 */
334
335 /**
336 * @param callback the callback to invoke when a
337 * packet transmission was completed successfully.
338 */
339 void SetTxOkCallback(TxOk callback);
340 /**
341 * @param callback the callback to invoke when a
342 * packet transmission was completed unsuccessfuly.
343 */
344 void SetTxFailedCallback(TxFailed callback);
345 /**
346 * @param callback the callback to invoke when an old MPDU is dropped
347 */
349
350 /**
351 * TracedCallback signature for state changes.
352 *
353 * @param [in] now Time when the \pname{state} changed.
354 * @param [in] recipient MAC address of the recipient.
355 * @param [in] tid the TID.
356 * @param [in] state The state.
357 */
359 const Mac48Address& recipient,
360 uint8_t tid,
362
363 /**
364 * @param mpdu the discarded frame
365 *
366 * Notify the block ack manager that an MPDU has been discarded, e.g., because
367 * the MSDU lifetime expired. If there is an established block ack agreement,
368 * make the transmit window advance beyond the discarded frame. This also
369 * involves (i) the removal of frames that consequently become old from the
370 * retransmit queue and from the queue of the block ack agreement, and (ii) the
371 * scheduling of a BlockAckRequest.
372 */
374
375 /**
376 * @param recipient the recipient
377 * @param tid the TID
378 * @return the BlockAckRequest header for the established BA agreement
379 *
380 * Get the BlockAckRequest header for the established BA agreement
381 * (<i>recipient</i>,<i>tid</i>).
382 */
383 CtrlBAckRequestHeader GetBlockAckReqHeader(const Mac48Address& recipient, uint8_t tid) const;
384
385 /**
386 * @param reqHdr the BlockAckRequest header
387 * @param hdr the 802.11 MAC header
388 *
389 * Enqueue the given BlockAckRequest into the queue storing the next BAR
390 * frames to transmit. If a BAR for the same recipient and TID is already present
391 * in the queue, it is replaced by the new one. If the given BAR is retransmitted,
392 * it is placed at the head of the queue, otherwise at the tail.
393 */
394 void ScheduleBar(const CtrlBAckRequestHeader& reqHdr, const WifiMacHeader& hdr);
395
396 /// agreement key typedef (MAC address and TID)
397 using AgreementKey = std::pair<Mac48Address, uint8_t>;
398
399 /**
400 * @return the list of BA agreements (identified by the recipient and TID pair) for which a BAR
401 * shall only be sent if there are queued data frames belonging to those agreements
402 */
403 const std::list<AgreementKey>& GetSendBarIfDataQueuedList() const;
404 /**
405 * Add the given (recipient, TID) pair to the list of BA agreements for which a BAR
406 * shall only be sent if there are queued data frames belonging to those agreements
407 *
408 * @param recipient the recipient
409 * @param tid the TID
410 */
411 void AddToSendBarIfDataQueuedList(const Mac48Address& recipient, uint8_t tid);
412 /**
413 * Remove the given (recipient, TID) pair from the list of BA agreements for which a BAR
414 * shall only be sent if there are queued data frames belonging to those agreements
415 *
416 * @param recipient the recipient
417 * @param tid the TID
418 */
419 void RemoveFromSendBarIfDataQueuedList(const Mac48Address& recipient, uint8_t tid);
420
421 protected:
422 void DoDispose() override;
423
424 private:
425 /**
426 * Inactivity timeout function
427 * @param recipient the recipient MAC address
428 * @param tid Traffic ID
429 */
430 void InactivityTimeout(const Mac48Address& recipient, uint8_t tid);
431
432 /**
433 * typedef for a list of WifiMpdu.
434 */
435 typedef std::list<Ptr<WifiMpdu>> PacketQueue;
436 /**
437 * typedef for an iterator for PacketQueue.
438 */
439 typedef std::list<Ptr<WifiMpdu>>::iterator PacketQueueI;
440
441 /// AgreementKey-indexed map of originator block ack agreements
443 std::map<AgreementKey, std::pair<OriginatorBlockAckAgreement, PacketQueue>>;
444 /// typedef for an iterator for Agreements
445 using OriginatorAgreementsI = OriginatorAgreements::iterator;
446
447 /// AgreementKey-indexed map of recipient block ack agreements
448 using RecipientAgreements = std::map<AgreementKey, RecipientBlockAckAgreement>;
449
450 /**
451 * Handle the given in flight MPDU based on its given status. If the status is
452 * ACKNOWLEDGED, the MPDU is removed from both the EDCA queue and the queue of
453 * in flight MPDUs. If the status is TO_RETRANSMIT, the MPDU is only removed
454 * from the queue of in flight MPDUs. Note that the MPDU is removed from both
455 * queues (independently of the status) if the MPDU is not stored in the EDCA
456 * queue, is an old packet or its lifetime expired.
457 *
458 * @param linkId the ID of the link on which the MPDU has been transmitted
459 * @param mpduIt an iterator pointing to the MPDU in the queue of in flight MPDUs
460 * @param status the status of the in flight MPDU
461 * @param it iterator pointing to the Block Ack agreement
462 * @param now the current time
463 * @return an iterator pointing to the next MPDU in the queue of in flight MPDUs
464 */
465 PacketQueueI HandleInFlightMpdu(uint8_t linkId,
466 PacketQueueI mpduIt,
467 MpduStatus status,
468 const OriginatorAgreementsI& it,
469 const Time& now);
470
471 /**
472 * This data structure contains, for each originator block ack agreement (recipient, TID),
473 * a set of packets for which an ack by block ack is requested.
474 * Every packet or fragment indicated as correctly received in BlockAck frame is
475 * erased from this data structure. Pushed back in retransmission queue otherwise.
476 */
478 RecipientAgreements m_recipientAgreements; //!< Recipient Block Ack agreements
479
480 std::list<AgreementKey> m_sendBarIfDataQueued; ///< list of BA agreements for which a BAR shall
481 ///< only be sent if data is queued
482
483 uint8_t m_blockAckThreshold; ///< block ack threshold
486 m_blockAckInactivityTimeout; ///< BlockAck inactivity timeout callback
489 TxOk m_txOkCallback; ///< transmit OK callback
490 TxFailed m_txFailedCallback; ///< transmit failed callback
491 DroppedOldMpdu m_droppedOldMpduCallback; ///< the dropped MPDU callback
492
493 /**
494 * The trace source fired when a state transition occurred.
495 */
498};
499
500} // namespace ns3
501
502#endif /* BLOCK_ACK_MANAGER_H */
Manages all block ack agreements for an originator station.
void SetTxFailedCallback(TxFailed callback)
RecipientAgreementOptConstRef GetAgreementAsRecipient(const Mac48Address &originator, uint8_t tid) const
std::map< AgreementKey, std::pair< OriginatorBlockAckAgreement, PacketQueue > > OriginatorAgreements
AgreementKey-indexed map of originator block ack agreements.
std::pair< Mac48Address, uint8_t > AgreementKey
agreement key typedef (MAC address and TID)
void UpdateOriginatorAgreement(const MgtAddBaResponseHeader &respHdr, const Mac48Address &recipient, uint16_t startingSeq)
Callback< void, Mac48Address, uint8_t > m_unblockPackets
unblock packets callback
OriginatorAgreements::iterator OriginatorAgreementsI
typedef for an iterator for Agreements
void SetQueue(const Ptr< WifiMacQueue > queue)
void DestroyRecipientAgreement(const Mac48Address &originator, uint8_t tid)
Destroy a recipient Block Ack agreement.
void SetTxOkCallback(TxOk callback)
void InactivityTimeout(const Mac48Address &recipient, uint8_t tid)
Inactivity timeout function.
uint8_t m_blockAckThreshold
block ack threshold
std::list< Ptr< WifiMpdu > > PacketQueue
typedef for a list of WifiMpdu.
RecipientAgreements m_recipientAgreements
Recipient Block Ack agreements.
static TypeId GetTypeId()
Get the type ID.
TracedCallback< Time, Mac48Address, uint8_t, OriginatorBlockAckAgreement::State > m_originatorAgreementState
The trace source fired when a state transition occurred.
void SetBlockAckThreshold(uint8_t nPackets)
DroppedOldMpdu m_droppedOldMpduCallback
the dropped MPDU callback
std::map< AgreementKey, RecipientBlockAckAgreement > RecipientAgreements
AgreementKey-indexed map of recipient block ack agreements.
void SetDroppedOldMpduCallback(DroppedOldMpdu callback)
TxFailed m_txFailedCallback
transmit failed callback
void SetUnblockDestinationCallback(Callback< void, Mac48Address, uint8_t > callback)
Set unblock destination callback.
std::optional< std::reference_wrapper< const OriginatorBlockAckAgreement > > OriginatorAgreementOptConstRef
optional const reference to OriginatorBlockAckAgreement
void NotifyOriginatorAgreementRejected(const Mac48Address &recipient, uint8_t tid)
Ptr< WifiMacQueue > m_queue
queue
uint16_t GetRecipientBufferSize(const Mac48Address &recipient, uint8_t tid) const
This function returns the buffer size negotiated with the recipient.
void CreateOriginatorAgreement(const MgtAddBaRequestHeader &reqHdr, const Mac48Address &recipient)
void CreateRecipientAgreement(const MgtAddBaResponseHeader &respHdr, const Mac48Address &originator, uint16_t startingSeq, Ptr< MacRxMiddle > rxMiddle)
void NotifyOriginatorAgreementNoReply(const Mac48Address &recipient, uint8_t tid)
void NotifyMissedBlockAck(uint8_t linkId, const Mac48Address &recipient, uint8_t tid)
OriginatorAgreements m_originatorAgreements
This data structure contains, for each originator block ack agreement (recipient, TID),...
void StorePacket(Ptr< WifiMpdu > mpdu)
void NotifyOriginatorAgreementReset(const Mac48Address &recipient, uint8_t tid)
void RemoveFromSendBarIfDataQueuedList(const Mac48Address &recipient, uint8_t tid)
Remove the given (recipient, TID) pair from the list of BA agreements for which a BAR shall only be s...
BlockAckManager & operator=(const BlockAckManager &)=delete
void NotifyGotAck(uint8_t linkId, Ptr< const WifiMpdu > mpdu)
Invoked upon receipt of an Ack frame on the given link after the transmission of a QoS data frame sen...
void AddToSendBarIfDataQueuedList(const Mac48Address &recipient, uint8_t tid)
Add the given (recipient, TID) pair to the list of BA agreements for which a BAR shall only be sent i...
void NotifyDiscardedMpdu(Ptr< const WifiMpdu > mpdu)
void NotifyGotMpdu(Ptr< const WifiMpdu > mpdu)
Callback< void, Ptr< const WifiMpdu > > TxFailed
typedef for a callback to invoke when an MPDU is negatively ack'ed.
bool NeedBarRetransmission(uint8_t tid, const Mac48Address &recipient)
This function returns true if a block ack agreement is established with the given recipient for the g...
Callback< void, Ptr< const WifiMpdu > > TxOk
typedef for a callback to invoke when an MPDU is successfully ack'ed.
void SetBlockDestinationCallback(Callback< void, Mac48Address, uint8_t > callback)
Set block destination callback.
std::list< Ptr< WifiMpdu > >::iterator PacketQueueI
typedef for an iterator for PacketQueue.
std::list< AgreementKey > m_sendBarIfDataQueued
list of BA agreements for which a BAR shall only be sent if data is queued
uint32_t GetNBufferedPackets(const Mac48Address &recipient, uint8_t tid) const
PacketQueueI HandleInFlightMpdu(uint8_t linkId, PacketQueueI mpduIt, MpduStatus status, const OriginatorAgreementsI &it, const Time &now)
Handle the given in flight MPDU based on its given status.
void SetBlockAckInactivityCallback(Callback< void, Mac48Address, uint8_t, bool > callback)
Set block ack inactivity callback.
uint16_t GetOriginatorStartingSequence(const Mac48Address &recipient, uint8_t tid) const
This function returns the starting sequence number of the transmit window.
BlockAckManager(const BlockAckManager &)=delete
Callback< void, Mac48Address, uint8_t, bool > m_blockAckInactivityTimeout
BlockAck inactivity timeout callback.
Callback< void, Ptr< const WifiMpdu > > DroppedOldMpdu
typedef for a callback to invoke when an MPDU is dropped.
TxOk m_txOkCallback
transmit OK callback
MpduStatus
Enumeration for the statuses of a buffered MPDU.
void(* AgreementStateTracedCallback)(Time now, const Mac48Address &recipient, uint8_t tid, OriginatorBlockAckAgreement::State state)
TracedCallback signature for state changes.
std::pair< uint16_t, uint16_t > NotifyGotBlockAck(uint8_t linkId, const CtrlBAckResponseHeader &blockAck, const Mac48Address &recipient, const std::set< uint8_t > &tids, size_t index=0)
void DoDispose() override
Destructor implementation.
std::optional< std::reference_wrapper< const RecipientBlockAckAgreement > > RecipientAgreementOptConstRef
optional const reference to RecipientBlockAckAgreement
void ScheduleBar(const CtrlBAckRequestHeader &reqHdr, const WifiMacHeader &hdr)
Callback< void, Mac48Address, uint8_t > m_blockPackets
block packets callback
void DestroyOriginatorAgreement(const Mac48Address &recipient, uint8_t tid)
OriginatorAgreementOptConstRef GetAgreementAsOriginator(const Mac48Address &recipient, uint8_t tid) const
CtrlBAckRequestHeader GetBlockAckReqHeader(const Mac48Address &recipient, uint8_t tid) const
const std::list< AgreementKey > & GetSendBarIfDataQueuedList() const
void NotifyGotBlockAckRequest(const Mac48Address &originator, uint8_t tid, uint16_t startingSeq)
void NotifyMissedAck(uint8_t linkId, Ptr< WifiMpdu > mpdu)
Invoked upon missed reception of an Ack frame on the given link after the transmission of a QoS data ...
Callback template class.
Definition callback.h:422
Headers for BlockAckRequest.
Headers for BlockAck response.
an EUI-48 address
Implement the header for management frames of type Add Block Ack request.
Implement the header for management frames of type Add Block Ack response.
A base class which provides memory management and object aggregation.
Definition object.h:78
State
Represents the state for this agreement.
Smart pointer class similar to boost::intrusive_ptr.
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
Forward calls to a chain of Callback.
a unique identifier for an interface.
Definition type-id.h:48
Implements the IEEE 802.11 MAC header.
Every class exported by the ns3 library is enclosed in the ns3 namespace.