A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
ht-frame-exchange-manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Stefano Avallone <stavallo@unina.it>
7 */
8
9#ifndef HT_FRAME_EXCHANGE_MANAGER_H
10#define HT_FRAME_EXCHANGE_MANAGER_H
11
12#include "ns3/mpdu-aggregator.h"
13#include "ns3/msdu-aggregator.h"
14#include "ns3/qos-frame-exchange-manager.h"
15
17
18namespace ns3
19{
20
23
24/**
25 * @ingroup wifi
26 *
27 * HtFrameExchangeManager handles the frame exchange sequences
28 * for HT stations.
29 */
31{
32 public:
33 /// allow AmpduAggregationTest class access
34 friend class ::AmpduAggregationTest;
35
36 /**
37 * @brief Get the type ID.
38 * @return the object TypeId
39 */
40 static TypeId GetTypeId();
42 ~HtFrameExchangeManager() override;
43
44 bool StartFrameExchange(Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
45 void SetWifiMac(const Ptr<WifiMac> mac) override;
46 void CalculateAcknowledgmentTime(WifiAcknowledgment* acknowledgment) const override;
47
48 /**
49 * Returns the aggregator used to construct A-MSDU subframes.
50 *
51 * @return the aggregator used to construct A-MSDU subframes.
52 */
54 /**
55 * Returns the aggregator used to construct A-MPDU subframes.
56 *
57 * @return the aggregator used to construct A-MPDU subframes.
58 */
60
61 /**
62 * Check if the PSDU obtained by aggregating the given MPDU to the PSDU specified
63 * by the given TX parameters meets the constraints on the maximum A-MPDU size
64 * and its transmission time does not exceed the given PPDU duration limit (if
65 * different than Time::Min()).
66 *
67 * @param mpdu the given MPDU
68 * @param txParams the TX parameters
69 * @param ppduDurationLimit the constraint on the PPDU transmission time
70 * @return true if the size and time constraints are met, false otherwise
71 */
73 const WifiTxParameters& txParams,
74 Time ppduDurationLimit) const override;
75
76 /**
77 * Check whether an A-MPDU of the given size meets the constraint on the maximum
78 * size for A-MPDUs sent to the given receiver, belonging to the given TID and
79 * transmitted using the given modulation class.
80 *
81 * @param ampduSize the size in bytes of the A-MPDU.
82 * @param receiver the address of the station that is the receiver of the A-MPDU
83 * @param tid the TID of the A-MPDU
84 * @param modulation the modulation class used to transmit the A-MPDU
85 * @return true if the constraint on the max A-MPDU size is met.
86 */
87 virtual bool IsWithinAmpduSizeLimit(uint32_t ampduSize,
88 Mac48Address receiver,
89 uint8_t tid,
90 WifiModulationClass modulation) const;
91
92 /**
93 * Check if aggregating an MSDU to the current MPDU (as specified by the given
94 * TX parameters) does not violate the size and time constraints, while taking
95 * into account the possibly updated protection and acknowledgment methods. If
96 * size and time constraints are met, the TX parameters are modified with the
97 * updated protection and acknowledgment methods.
98 *
99 * @param msdu the given MSDU
100 * @param txParams the TX parameters
101 * @param availableTime the constraint on the TX time of the PSDU, if different
102 * than Time::Min()
103 * @return true if aggregating an MSDU to the current PSDU does not violate the
104 * size and time constraints
105 */
106 virtual bool TryAggregateMsdu(Ptr<const WifiMpdu> msdu,
107 WifiTxParameters& txParams,
108 Time availableTime) const;
109
110 /**
111 * Check if the PSDU obtained by aggregating the given MSDU to the PSDU specified
112 * by the given TX parameters meets the constraints on the maximum A-MSDU size
113 * and its transmission time does not exceed the given PPDU duration limit (if
114 * different than Time::Min()).
115 *
116 * @param msdu the given MSDU
117 * @param txParams the TX parameters
118 * @param ppduDurationLimit the constraint on the PPDU transmission time
119 * @return true if the size and time constraints are met, false otherwise
120 */
122 const WifiTxParameters& txParams,
123 Time ppduDurationLimit) const;
124
125 /**
126 * This method can be called to accept a received ADDBA Request. An
127 * ADDBA Response will be constructed and queued for transmission.
128 *
129 * @param reqHdr the received ADDBA Request header.
130 * @param originator the MAC address of the originator.
131 */
132 void SendAddBaResponse(const MgtAddBaRequestHeader& reqHdr, Mac48Address originator);
133
134 /**
135 * Sends DELBA frame to cancel a block ack agreement with STA
136 * addressed by <i>addr</i> for TID <i>tid</i>.
137 *
138 * @param addr address of the recipient.
139 * @param tid traffic ID.
140 * @param byOriginator flag to indicate whether this is set by the originator.
141 * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
142 */
144 uint8_t tid,
145 bool byOriginator,
146 std::optional<Mac48Address> gcrGroupAddr);
147
148 /**
149 * Get the next BlockAckRequest or MU-BAR Trigger Frame to send, if any. If TID and recipient
150 * address are given, then only return a BlockAckRequest, if any, addressed to that recipient
151 * and for the given TID.
152 *
153 * @param ac the AC whose queue is searched for BlockAckRequest or Trigger Frames
154 * @param optTid the TID (optional)
155 * @param optAddress the recipient of the BAR (optional)
156 *
157 * @return the next BAR or Trigger Frame to be sent, if any
158 */
160 std::optional<uint8_t> optTid = std::nullopt,
161 std::optional<Mac48Address> optAddress = std::nullopt);
162
163 /**
164 * Get a PSDU containing the given MPDU
165 *
166 * @param mpdu the given MPDU
167 * @param txVector the TXVECTOR to use to send the MPDU
168 * @return a PSDU containing the given MPDU
169 */
170 virtual Ptr<WifiPsdu> GetWifiPsdu(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector) const;
171
172 protected:
173 void DoDispose() override;
174
176 RxSignalInfo rxSignalInfo,
177 const WifiTxVector& txVector,
178 bool inAmpdu) override;
180 const RxSignalInfo& rxSignalInfo,
181 const WifiTxVector& txVector,
182 const std::vector<bool>& perMpduStatus) override;
183 void NotifyReceivedNormalAck(Ptr<WifiMpdu> mpdu) override;
184 void NotifyPacketDiscarded(Ptr<const WifiMpdu> mpdu) override;
185 void RetransmitMpduAfterMissedAck(Ptr<WifiMpdu> mpdu) const override;
186 void ReleaseSequenceNumbers(Ptr<const WifiPsdu> psdu) const override;
187 void ForwardMpduDown(Ptr<WifiMpdu> mpdu, WifiTxVector& txVector) override;
188 void FinalizeMacHeader(Ptr<const WifiPsdu> psdu) override;
189 void CtsTimeout(Ptr<WifiMpdu> rts, const WifiTxVector& txVector) override;
190 void TransmissionSucceeded() override;
191 void ProtectionCompleted() override;
192 void NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu) override;
193 bool SendBufferedUnit(Mac48Address sender) override;
194
195 /**
196 * Process a received management action frame that relates to Block Ack agreement.
197 *
198 * @param mpdu the MPDU carrying the received management action frame
199 * @param txVector the TXVECTOR used to transmit the management action frame
200 */
201 void ReceiveMgtAction(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector);
202
203 /**
204 * Get the Block Ack Manager handling the given TID.
205 *
206 * @param tid the given TID
207 * @return the Block Ack Manager handling the given TID
208 */
209 Ptr<BlockAckManager> GetBaManager(uint8_t tid) const;
210
211 /**
212 * Compute how to set the Duration/ID field of PSDUs that do not include fragments.
213 *
214 * @param txDuration the duration of the PSDU transmission
215 * @param txParams the TX parameters used to send the PSDU
216 * @return the value for the Duration/ID field
217 */
218 virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters& txParams) const;
219
220 /**
221 * Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or
222 * a BlockAckReq frame followed by a BlockAck frame for the acknowledgment.
223 * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
224 * undefined state.
225 *
226 * @param psdu the PSDU to send
227 * @param txParams the TX parameters to use to transmit the PSDU
228 */
230
231 /**
232 * Notify the transmission of the given PSDU to the EDCAF associated with the
233 * AC the PSDU belongs to.
234 *
235 * @param psdu the PSDU to transmit
236 */
237 virtual void NotifyTxToEdca(Ptr<const WifiPsdu> psdu) const;
238
239 /**
240 * Forward a PSDU down to the PHY layer. Also, notify the Block Ack Manager
241 * of the transmission of the constituent MPDUs.
242 *
243 * @param psdu the PSDU to forward down
244 * @param txVector the TXVECTOR used to transmit the MPDU
245 */
246 virtual void ForwardPsduDown(Ptr<const WifiPsdu> psdu, WifiTxVector& txVector);
247
248 /**
249 * Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
250 *
251 * @param psdu the given PSDU
252 */
254
255 /**
256 * If the given MPDU contains a BlockAckReq frame (the duration of which plus the response
257 * fits within the given available time, if the latter is not Time::Min() and this is not
258 * the initial frame of a TXOP), transmit the frame and return true. Otherwise, return false.
259 *
260 * @param mpdu the given MPDU
261 * @param availableTime the amount of time allowed for the frame exchange. Equals
262 * Time::Min() in case the TXOP limit is null
263 * @param initialFrame true if the frame being transmitted is the initial frame
264 * of the TXOP. This is used to determine whether the TXOP
265 * limit can be exceeded
266 * @return true if frame is transmitted, false otherwise
267 */
268 virtual bool SendMpduFromBaManager(Ptr<WifiMpdu> mpdu, Time availableTime, bool initialFrame);
269
270 /**
271 * Given a non-broadcast QoS data frame, prepare the PSDU to transmit by attempting
272 * A-MSDU and A-MPDU aggregation (if enabled), while making sure that the frame
273 * exchange (possibly including protection and acknowledgment) is completed within
274 * the given available time.
275 *
276 * @param peekedItem the given non-broadcast QoS data frame
277 * @param availableTime the amount of time allowed for the frame exchange. Equals
278 * Time::Min() in case the TXOP limit is null
279 * @param initialFrame true if the frame being transmitted is the initial frame
280 * of the TXOP. This is used to determine whether the TXOP
281 * limit can be exceeded
282 * @return true if frame is transmitted, false otherwise
283 */
284 virtual bool SendDataFrame(Ptr<WifiMpdu> peekedItem, Time availableTime, bool initialFrame);
285
286 /**
287 * Retrieve the starting sequence number for a BA agreement to be established.
288 *
289 * @param header the MAC header of the next data packet selected for transmission once the BA
290 * agreement is established. \return the starting sequence number for a BA agreement to be
291 * established
292 */
294
295 /**
296 * A Block Ack agreement needs to be established with the given recipient for the
297 * given TID if it does not already exist (or exists and is in state RESET) and:
298 *
299 * - the number of packets in the queue reaches the BlockAckThreshold value OR
300 * - MPDU aggregation is enabled and there is more than one packet in the queue OR
301 * - the station is a VHT station
302 *
303 * @param recipient address of the recipient.
304 * @param tid traffic ID.
305 * @return true if a Block Ack agreement needs to be established, false otherwise.
306 */
307 virtual bool NeedSetupBlockAck(Mac48Address recipient, uint8_t tid);
308
309 /**
310 * A Block Ack agreement needs to be established prior to the transmission of a groupcast data
311 * packet using the GCR service if it does not already exist (or exists and is in state RESET)
312 * for all member STAs and:
313 *
314 * - the number of packets in the groupcast queue reaches the BlockAckThreshold value OR
315 * - MPDU aggregation is enabled and there is more than one groupcast packet in the queue OR
316 * - the station is a VHT station
317 *
318 * @param header the MAC header of the next groupcast data packet selected for transmission.
319 * @return the recipient of the ADDBA frame if a Block Ack agreement needs to be established,
320 * std::nullopt otherwise.
321 */
322 virtual std::optional<Mac48Address> NeedSetupGcrBlockAck(const WifiMacHeader& header);
323
324 /**
325 * Sends an ADDBA Request to establish a block ack agreement with STA
326 * addressed by <i>recipient</i> for TID <i>tid</i>.
327 *
328 * @param recipient address of the recipient.
329 * @param tid traffic ID.
330 * @param startingSeq the BA agreement starting sequence number
331 * @param timeout timeout value.
332 * @param immediateBAck flag to indicate whether immediate BlockAck is used.
333 * @param availableTime the amount of time allowed for the frame exchange. Equals
334 * Time::Min() in case the TXOP limit is null
335 * @param gcrGroupAddr the GCR Group Address (only if the Block Ack agreement is being
336 * set up for the GCR service)
337 * @return true if ADDBA Request frame is transmitted, false otherwise
338 */
339 bool SendAddBaRequest(Mac48Address recipient,
340 uint8_t tid,
341 uint16_t startingSeq,
342 uint16_t timeout,
343 bool immediateBAck,
344 Time availableTime,
345 std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
346
347 /**
348 * Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
349 *
350 * @param agreement the agreement the Block Ack response belongs to
351 * @param durationId the Duration/ID of the frame soliciting this Block Ack response
352 * @param blockAckTxVector the transmit vector for the Block Ack response
353 * @param rxSnr the receive SNR
354 * @param gcrGroupAddr the GCR Group Address (only if the Block Ack is being used for the GCR
355 * service)
356 */
357 void SendBlockAck(const RecipientBlockAckAgreement& agreement,
358 Time durationId,
359 WifiTxVector& blockAckTxVector,
360 double rxSnr,
361 std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
362
363 /**
364 * Called when the BlockAck timeout expires.
365 *
366 * @param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
367 * @param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
368 */
369 virtual void BlockAckTimeout(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
370
371 /**
372 * Take necessary actions when a BlockAck is missed, such as scheduling a
373 * BlockAckReq frame or the retransmission of the unacknowledged frames.
374 *
375 * @param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
376 * @param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
377 */
378 virtual void MissedBlockAck(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
379
380 /**
381 * Perform required actions to ensure the receiver window is flushed when a groupcast A-MPDU is
382 * received via the GCR service. If there are pending groupcast MPDUs from that recipient and
383 * that traffic ID, these MPDUs are forwarded up, by assuming an implicit BAR from the
384 * originator.
385 *
386 * @param groupAddress the destination group address of the MPDUs
387 * @param originator MAC address of the sender of the groupcast MPDUs
388 * @param tid Traffic ID
389 * @param seq the starting sequence number of the recipient window
390 */
391 void FlushGroupcastMpdus(const Mac48Address& groupAddress,
392 const Mac48Address& originator,
393 uint8_t tid,
394 uint16_t seq);
395
396 /// agreement key typedef (MAC address and TID)
397 typedef std::pair<Mac48Address, uint8_t> AgreementKey;
398
399 Ptr<MsduAggregator> m_msduAggregator; //!< A-MSDU aggregator
400 Ptr<MpduAggregator> m_mpduAggregator; //!< A-MPDU aggregator
401
402 /// pending ADDBA_RESPONSE frames indexed by agreement key
403 std::map<AgreementKey, Ptr<WifiMpdu>> m_pendingAddBaResp;
404
405 private:
406 /**
407 * Send the current PSDU, which can be acknowledged by a BlockAck frame or
408 * followed by a BlockAckReq frame and a BlockAck frame.
409 */
410 void SendPsdu();
411
412 Ptr<WifiPsdu> m_psdu; //!< the A-MPDU being transmitted
413 WifiTxParameters m_txParams; //!< the TX parameters for the current frame
414
415 EventId m_flushGroupcastMpdusEvent; //!< the event to flush pending groupcast MPDUs from
416 //!< previously received A-MPDU
417};
418
419} // namespace ns3
420
421#endif /* HT_FRAME_EXCHANGE_MANAGER_H */
Ampdu Aggregation Test.
An identifier for simulation events.
Definition event-id.h:45
Ptr< MpduAggregator > m_mpduAggregator
A-MPDU aggregator.
void ReceiveMpdu(Ptr< const WifiMpdu > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu) override
This method handles the reception of an MPDU (possibly included in an A-MPDU).
std::map< AgreementKey, Ptr< WifiMpdu > > m_pendingAddBaResp
pending ADDBA_RESPONSE frames indexed by agreement key
void FlushGroupcastMpdus(const Mac48Address &groupAddress, const Mac48Address &originator, uint8_t tid, uint16_t seq)
Perform required actions to ensure the receiver window is flushed when a groupcast A-MPDU is received...
void SendAddBaResponse(const MgtAddBaRequestHeader &reqHdr, Mac48Address originator)
This method can be called to accept a received ADDBA Request.
void CtsTimeout(Ptr< WifiMpdu > rts, const WifiTxVector &txVector) override
Called when the CTS timeout expires.
Ptr< WifiPsdu > m_psdu
the A-MPDU being transmitted
Ptr< BlockAckManager > GetBaManager(uint8_t tid) const
Get the Block Ack Manager handling the given TID.
virtual Ptr< WifiPsdu > GetWifiPsdu(Ptr< WifiMpdu > mpdu, const WifiTxVector &txVector) const
Get a PSDU containing the given MPDU.
virtual void BlockAckTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Called when the BlockAck timeout expires.
Ptr< WifiMpdu > GetBar(AcIndex ac, std::optional< uint8_t > optTid=std::nullopt, std::optional< Mac48Address > optAddress=std::nullopt)
Get the next BlockAckRequest or MU-BAR Trigger Frame to send, if any.
virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters &txParams) const
Compute how to set the Duration/ID field of PSDUs that do not include fragments.
virtual bool NeedSetupBlockAck(Mac48Address recipient, uint8_t tid)
A Block Ack agreement needs to be established with the given recipient for the given TID if it does n...
void FinalizeMacHeader(Ptr< const WifiPsdu > psdu) override
Finalize the MAC header of the MPDUs in the given PSDU before transmission.
void TransmissionSucceeded() override
Take necessary actions upon a transmission success.
virtual bool SendMpduFromBaManager(Ptr< WifiMpdu > mpdu, Time availableTime, bool initialFrame)
If the given MPDU contains a BlockAckReq frame (the duration of which plus the response fits within t...
Ptr< MpduAggregator > GetMpduAggregator() const
Returns the aggregator used to construct A-MPDU subframes.
virtual bool IsWithinLimitsIfAggregateMsdu(Ptr< const WifiMpdu > msdu, const WifiTxParameters &txParams, Time ppduDurationLimit) const
Check if the PSDU obtained by aggregating the given MSDU to the PSDU specified by the given TX parame...
virtual bool IsWithinAmpduSizeLimit(uint32_t ampduSize, Mac48Address receiver, uint8_t tid, WifiModulationClass modulation) const
Check whether an A-MPDU of the given size meets the constraint on the maximum size for A-MPDUs sent t...
void SetWifiMac(const Ptr< WifiMac > mac) override
Set the MAC layer to use.
virtual std::optional< Mac48Address > NeedSetupGcrBlockAck(const WifiMacHeader &header)
A Block Ack agreement needs to be established prior to the transmission of a groupcast data packet us...
bool SendAddBaRequest(Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck, Time availableTime, std::optional< Mac48Address > gcrGroupAddr=std::nullopt)
Sends an ADDBA Request to establish a block ack agreement with STA addressed by recipient for TID tid...
void ProtectionCompleted() override
Transmit prepared frame immediately, if no protection was used, or in a SIFS, if protection was compl...
void ForwardMpduDown(Ptr< WifiMpdu > mpdu, WifiTxVector &txVector) override
Forward an MPDU down to the PHY layer.
Ptr< MsduAggregator > GetMsduAggregator() const
Returns the aggregator used to construct A-MSDU subframes.
void SendPsduWithProtection(Ptr< WifiPsdu > psdu, WifiTxParameters &txParams)
Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or a BlockAckReq frame followed...
void NotifyReceivedNormalAck(Ptr< WifiMpdu > mpdu) override
Notify other components that an MPDU was acknowledged.
void EndReceiveAmpdu(Ptr< const WifiPsdu > psdu, const RxSignalInfo &rxSignalInfo, const WifiTxVector &txVector, const std::vector< bool > &perMpduStatus) override
This method is called when the reception of an A-MPDU including multiple MPDUs is completed.
void RetransmitMpduAfterMissedAck(Ptr< WifiMpdu > mpdu) const override
Retransmit an MPDU that was not acknowledged.
void DoDispose() override
Destructor implementation.
static TypeId GetTypeId()
Get the type ID.
bool StartFrameExchange(Ptr< QosTxop > edca, Time availableTime, bool initialFrame) override
Start a frame exchange (including protection frames and acknowledgment frames as needed) that fits wi...
WifiTxParameters m_txParams
the TX parameters for the current frame
bool IsWithinLimitsIfAddMpdu(Ptr< const WifiMpdu > mpdu, const WifiTxParameters &txParams, Time ppduDurationLimit) const override
Check if the PSDU obtained by aggregating the given MPDU to the PSDU specified by the given TX parame...
void SendPsdu()
Send the current PSDU, which can be acknowledged by a BlockAck frame or followed by a BlockAckReq fra...
void ReceiveMgtAction(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector)
Process a received management action frame that relates to Block Ack agreement.
virtual bool TryAggregateMsdu(Ptr< const WifiMpdu > msdu, WifiTxParameters &txParams, Time availableTime) const
Check if aggregating an MSDU to the current MPDU (as specified by the given TX parameters) does not v...
virtual void NotifyTxToEdca(Ptr< const WifiPsdu > psdu) const
Notify the transmission of the given PSDU to the EDCAF associated with the AC the PSDU belongs to.
virtual bool SendDataFrame(Ptr< WifiMpdu > peekedItem, Time availableTime, bool initialFrame)
Given a non-broadcast QoS data frame, prepare the PSDU to transmit by attempting A-MSDU and A-MPDU ag...
void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator, std::optional< Mac48Address > gcrGroupAddr)
Sends DELBA frame to cancel a block ack agreement with STA addressed by addr for TID tid.
virtual void MissedBlockAck(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Take necessary actions when a BlockAck is missed, such as scheduling a BlockAckReq frame or the retra...
void NotifyPacketDiscarded(Ptr< const WifiMpdu > mpdu) override
Pass the given MPDU, discarded because of the max retry limit was reached, to the MPDU dropped callba...
virtual void ForwardPsduDown(Ptr< const WifiPsdu > psdu, WifiTxVector &txVector)
Forward a PSDU down to the PHY layer.
bool SendBufferedUnit(Mac48Address sender) override
Send a buffered unit to the given sender, if any.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
EventId m_flushGroupcastMpdusEvent
the event to flush pending groupcast MPDUs from previously received A-MPDU
void DequeuePsdu(Ptr< const WifiPsdu > psdu)
Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
void ReleaseSequenceNumbers(Ptr< const WifiPsdu > psdu) const override
Make the sequence numbers of MPDUs included in the given PSDU available again if the MPDUs have never...
void SendBlockAck(const RecipientBlockAckAgreement &agreement, Time durationId, WifiTxVector &blockAckTxVector, double rxSnr, std::optional< Mac48Address > gcrGroupAddr=std::nullopt)
Create a BlockAck frame with header equal to blockAck and start its transmission.
Ptr< MsduAggregator > m_msduAggregator
A-MSDU aggregator.
std::pair< Mac48Address, uint8_t > AgreementKey
agreement key typedef (MAC address and TID)
void NotifyLastGcrUrTx(Ptr< const WifiMpdu > mpdu) override
Notify the last (re)transmission of a groupcast MPDU using the GCR-UR service.
uint16_t GetBaAgreementStartingSequenceNumber(const WifiMacHeader &header)
Retrieve the starting sequence number for a BA agreement to be established.
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.
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:70
Maintains the scoreboard and the receive reordering buffer used by a recipient of a Block Ack agreeme...
Simulation virtual time values and global simulation resolution.
Definition nstime.h:95
a unique identifier for an interface.
Definition type-id.h:50
Implements the IEEE 802.11 MAC header.
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802....
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition qos-utils.h:64
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::Time timeout
RxSignalInfo structure containing info on the received signal.
Definition wifi-types.h:84
WifiAcknowledgment is an abstract base struct.