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 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Stefano Avallone <stavallo@unina.it>
18 */
19
20#ifndef HT_FRAME_EXCHANGE_MANAGER_H
21#define HT_FRAME_EXCHANGE_MANAGER_H
22
23#include "ns3/mpdu-aggregator.h"
24#include "ns3/msdu-aggregator.h"
25#include "ns3/qos-frame-exchange-manager.h"
26#include "ns3/wifi-psdu.h"
27
29
30namespace ns3
31{
32
33class MgtAddBaResponseHeader;
34class RecipientBlockAckAgreement;
35
36/**
37 * \ingroup wifi
38 *
39 * HtFrameExchangeManager handles the frame exchange sequences
40 * for HT stations.
41 */
43{
44 public:
45 /// allow AmpduAggregationTest class access
46 friend class ::AmpduAggregationTest;
47
48 /**
49 * \brief Get the type ID.
50 * \return the object TypeId
51 */
52 static TypeId GetTypeId();
54 ~HtFrameExchangeManager() override;
55
56 bool StartFrameExchange(Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
57 void SetWifiMac(const Ptr<WifiMac> mac) override;
58 void CalculateAcknowledgmentTime(WifiAcknowledgment* acknowledgment) const override;
59
60 /**
61 * Returns the aggregator used to construct A-MSDU subframes.
62 *
63 * \return the aggregator used to construct A-MSDU subframes.
64 */
66 /**
67 * Returns the aggregator used to construct A-MPDU subframes.
68 *
69 * \return the aggregator used to construct A-MPDU subframes.
70 */
72
73 /**
74 * Check if the PSDU obtained by aggregating the given MPDU to the PSDU specified
75 * by the given TX parameters meets the constraints on the maximum A-MPDU size
76 * and its transmission time does not exceed the given PPDU duration limit (if
77 * different than Time::Min()).
78 *
79 * \param mpdu the given MPDU
80 * \param txParams the TX parameters
81 * \param ppduDurationLimit the constraint on the PPDU transmission time
82 * \return true if the size and time constraints are met, false otherwise
83 */
85 const WifiTxParameters& txParams,
86 Time ppduDurationLimit) const override;
87
88 /**
89 * Check whether an A-MPDU of the given size meets the constraint on the maximum
90 * size for A-MPDUs sent to the given receiver, belonging to the given TID and
91 * transmitted using the given modulation class.
92 *
93 * \param ampduSize the size in bytes of the A-MPDU.
94 * \param receiver the address of the station that is the receiver of the A-MPDU
95 * \param tid the TID of the A-MPDU
96 * \param modulation the modulation class used to transmit the A-MPDU
97 * \return true if the constraint on the max A-MPDU size is met.
98 */
99 virtual bool IsWithinAmpduSizeLimit(uint32_t ampduSize,
100 Mac48Address receiver,
101 uint8_t tid,
102 WifiModulationClass modulation) const;
103
104 /**
105 * Check if aggregating an MSDU to the current MPDU (as specified by the given
106 * TX parameters) does not violate the size and time constraints, while taking
107 * into account the possibly updated protection and acknowledgment methods. If
108 * size and time constraints are met, the TX parameters are modified with the
109 * updated protection and acknowledgment methods.
110 *
111 * \param msdu the given MSDU
112 * \param txParams the TX parameters
113 * \param availableTime the constraint on the TX time of the PSDU, if different
114 * than Time::Min()
115 * \return true if aggregating an MSDU to the current PSDU does not violate the
116 * size and time constraints
117 */
118 virtual bool TryAggregateMsdu(Ptr<const WifiMpdu> msdu,
119 WifiTxParameters& txParams,
120 Time availableTime) const;
121
122 /**
123 * Check if the PSDU obtained by aggregating the given MSDU to the PSDU specified
124 * by the given TX parameters meets the constraints on the maximum A-MSDU size
125 * and its transmission time does not exceed the given PPDU duration limit (if
126 * different than Time::Min()).
127 *
128 * \param msdu the given MSDU
129 * \param txParams the TX parameters
130 * \param ppduDurationLimit the constraint on the PPDU transmission time
131 * \return true if the size and time constraints are met, false otherwise
132 */
134 const WifiTxParameters& txParams,
135 Time ppduDurationLimit) const;
136
137 /**
138 * This method can be called to accept a received ADDBA Request. An
139 * ADDBA Response will be constructed and queued for transmission.
140 *
141 * \param reqHdr a pointer to the received ADDBA Request header.
142 * \param originator the MAC address of the originator.
143 */
144 void SendAddBaResponse(const MgtAddBaRequestHeader* reqHdr, Mac48Address originator);
145
146 /**
147 * Sends DELBA frame to cancel a block ack agreement with STA
148 * addressed by <i>addr</i> for TID <i>tid</i>.
149 *
150 * \param addr address of the recipient.
151 * \param tid traffic ID.
152 * \param byOriginator flag to indicate whether this is set by the originator.
153 */
154 void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator);
155
156 /**
157 * Get the next BlockAckRequest or MU-BAR Trigger Frame to send, if any. If TID and recipient
158 * address are given, then only return a BlockAckRequest, if any, addressed to that recipient
159 * and for the given TID.
160 *
161 * \param ac the AC whose queue is searched for BlockAckRequest or Trigger Frames
162 * \param optTid the TID (optional)
163 * \param optAddress the recipient of the BAR (optional)
164 *
165 * \return the next BAR or Trigger Frame to be sent, if any
166 */
168 std::optional<uint8_t> optTid = std::nullopt,
169 std::optional<Mac48Address> optAddress = std::nullopt);
170
171 protected:
172 void DoDispose() override;
173
175 RxSignalInfo rxSignalInfo,
176 const WifiTxVector& txVector,
177 bool inAmpdu) override;
179 const RxSignalInfo& rxSignalInfo,
180 const WifiTxVector& txVector,
181 const std::vector<bool>& perMpduStatus) override;
182 void NotifyReceivedNormalAck(Ptr<WifiMpdu> mpdu) override;
183 void NotifyPacketDiscarded(Ptr<const WifiMpdu> mpdu) override;
184 void RetransmitMpduAfterMissedAck(Ptr<WifiMpdu> mpdu) const override;
185 void ReleaseSequenceNumbers(Ptr<const WifiPsdu> psdu) const override;
186 void ForwardMpduDown(Ptr<WifiMpdu> mpdu, WifiTxVector& txVector) override;
187 void FinalizeMacHeader(Ptr<const WifiPsdu> psdu) override;
188 void CtsTimeout(Ptr<WifiMpdu> rts, const WifiTxVector& txVector) override;
189 void TransmissionSucceeded() override;
190 void ProtectionCompleted() override;
191
192 /**
193 * Get a PSDU containing the given MPDU
194 *
195 * \param mpdu the given MPDU
196 * \param txVector the TXVECTOR to use to send the MPDU
197 * \return a PSDU containing the given MPDU
198 */
199 virtual Ptr<WifiPsdu> GetWifiPsdu(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector) const;
200
201 /**
202 * Get the Block Ack Manager handling the given TID.
203 *
204 * \param tid the given TID
205 * \return the Block Ack Manager handling the given TID
206 */
207 Ptr<BlockAckManager> GetBaManager(uint8_t tid) const;
208
209 /**
210 * Compute how to set the Duration/ID field of PSDUs that do not include fragments.
211 *
212 * \param txDuration the duration of the PSDU transmission
213 * \param txParams the TX parameters used to send the PSDU
214 * \return the value for the Duration/ID field
215 */
216 virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters& txParams) const;
217
218 /**
219 * Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or
220 * a BlockAckReq frame followed by a BlockAck frame for the acknowledgment.
221 * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
222 * undefined state.
223 *
224 * \param psdu the PSDU to send
225 * \param txParams the TX parameters to use to transmit the PSDU
226 */
228
229 /**
230 * Notify the transmission of the given PSDU to the EDCAF associated with the
231 * AC the PSDU belongs to.
232 *
233 * \param psdu the PSDU to transmit
234 */
235 virtual void NotifyTxToEdca(Ptr<const WifiPsdu> psdu) const;
236
237 /**
238 * Forward a PSDU down to the PHY layer. Also, notify the Block Ack Manager
239 * of the transmission of the constituent MPDUs.
240 *
241 * \param psdu the PSDU to forward down
242 * \param txVector the TXVECTOR used to transmit the MPDU
243 */
244 virtual void ForwardPsduDown(Ptr<const WifiPsdu> psdu, WifiTxVector& txVector);
245
246 /**
247 * Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
248 *
249 * \param psdu the given PSDU
250 */
252
253 /**
254 * If the given MPDU contains a BlockAckReq frame (the duration of which plus the response
255 * fits within the given available time, if the latter is not Time::Min() and this is not
256 * the initial frame of a TXOP), transmit the frame and return true. Otherwise, return false.
257 *
258 * \param mpdu the given MPDU
259 * \param availableTime the amount of time allowed for the frame exchange. Equals
260 * Time::Min() in case the TXOP limit is null
261 * \param initialFrame true if the frame being transmitted is the initial frame
262 * of the TXOP. This is used to determine whether the TXOP
263 * limit can be exceeded
264 * \return true if frame is transmitted, false otherwise
265 */
266 virtual bool SendMpduFromBaManager(Ptr<WifiMpdu> mpdu, Time availableTime, bool initialFrame);
267
268 /**
269 * Given a non-broadcast QoS data frame, prepare the PSDU to transmit by attempting
270 * A-MSDU and A-MPDU aggregation (if enabled), while making sure that the frame
271 * exchange (possibly including protection and acknowledgment) is completed within
272 * the given available time.
273 *
274 * \param peekedItem the given non-broadcast QoS data frame
275 * \param availableTime the amount of time allowed for the frame exchange. Equals
276 * Time::Min() in case the TXOP limit is null
277 * \param initialFrame true if the frame being transmitted is the initial frame
278 * of the TXOP. This is used to determine whether the TXOP
279 * limit can be exceeded
280 * \return true if frame is transmitted, false otherwise
281 */
282 virtual bool SendDataFrame(Ptr<WifiMpdu> peekedItem, Time availableTime, bool initialFrame);
283
284 /**
285 * A Block Ack agreement needs to be established with the given recipient for the
286 * given TID if it does not already exist (or exists and is in state RESET) and:
287 *
288 * - the number of packets in the queue reaches the BlockAckThreshold value OR
289 * - MPDU aggregation is enabled and there is more than one packet in the queue OR
290 * - the station is a VHT station
291 *
292 * \param recipient address of the recipient.
293 * \param tid traffic ID.
294 * \return true if a Block Ack agreement needs to be established, false otherwise.
295 */
296 virtual bool NeedSetupBlockAck(Mac48Address recipient, uint8_t tid);
297
298 /**
299 * Sends an ADDBA Request to establish a block ack agreement with STA
300 * addressed by <i>recipient</i> for TID <i>tid</i>.
301 *
302 * \param recipient address of the recipient.
303 * \param tid traffic ID.
304 * \param startingSeq the BA agreement starting sequence number
305 * \param timeout timeout value.
306 * \param immediateBAck flag to indicate whether immediate BlockAck is used.
307 * \param availableTime the amount of time allowed for the frame exchange. Equals
308 * Time::Min() in case the TXOP limit is null
309 * \return true if ADDBA Request frame is transmitted, false otherwise
310 */
311 bool SendAddBaRequest(Mac48Address recipient,
312 uint8_t tid,
313 uint16_t startingSeq,
314 uint16_t timeout,
315 bool immediateBAck,
316 Time availableTime);
317
318 /**
319 * Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
320 *
321 * \param agreement the agreement the Block Ack response belongs to
322 * \param durationId the Duration/ID of the frame soliciting this Block Ack response
323 * \param blockAckTxVector the transmit vector for the Block Ack response
324 * \param rxSnr the receive SNR
325 */
326 void SendBlockAck(const RecipientBlockAckAgreement& agreement,
327 Time durationId,
328 WifiTxVector& blockAckTxVector,
329 double rxSnr);
330
331 /**
332 * Called when the BlockAck timeout expires.
333 *
334 * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
335 * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
336 */
337 virtual void BlockAckTimeout(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
338
339 /**
340 * Take necessary actions when a BlockAck is missed, such as scheduling a
341 * BlockAckReq frame or the retransmission of the unacknowledged frames.
342 *
343 * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
344 * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
345 * \param[out] resetCw true if we shall stop retransmitting the PSDU
346 */
347 virtual void MissedBlockAck(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector, bool& resetCw);
348
349 /// agreement key typedef (MAC address and TID)
350 typedef std::pair<Mac48Address, uint8_t> AgreementKey;
351
352 Ptr<MsduAggregator> m_msduAggregator; //!< A-MSDU aggregator
353 Ptr<MpduAggregator> m_mpduAggregator; //!< A-MPDU aggregator
354
355 /// pending ADDBA_RESPONSE frames indexed by agreement key
356 std::map<AgreementKey, Ptr<WifiMpdu>> m_pendingAddBaResp;
357
358 private:
359 /**
360 * Send the current PSDU, which can be acknowledged by a BlockAck frame or
361 * followed by a BlockAckReq frame and a BlockAck frame.
362 */
363 void SendPsdu();
364
365 Ptr<WifiPsdu> m_psdu; //!< the A-MPDU being transmitted
366 WifiTxParameters m_txParams; //!< the TX parameters for the current frame
367};
368
369} // namespace ns3
370
371#endif /* HT_FRAME_EXCHANGE_MANAGER_H */
Ampdu Aggregation Test.
HtFrameExchangeManager handles the frame exchange sequences for HT stations.
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)
void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator)
Sends DELBA frame to cancel a block ack agreement with STA addressed by addr for TID tid.
std::map< AgreementKey, Ptr< WifiMpdu > > m_pendingAddBaResp
pending ADDBA_RESPONSE frames indexed by agreement key
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.
void ProtectionCompleted() override
Transmit prepared frame upon successful protection mechanism.
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...
bool SendAddBaRequest(Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck, Time availableTime)
Sends an ADDBA Request to establish a block ack agreement with STA addressed by recipient for TID tid...
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 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.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
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...
virtual void MissedBlockAck(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector, bool &resetCw)
Take necessary actions when a BlockAck is missed, such as scheduling a BlockAckReq frame or the retra...
Ptr< MsduAggregator > m_msduAggregator
A-MSDU aggregator.
std::pair< Mac48Address, uint8_t > AgreementKey
agreement key typedef (MAC address and TID)
void SendBlockAck(const RecipientBlockAckAgreement &agreement, Time durationId, WifiTxVector &blockAckTxVector, double rxSnr)
Create a BlockAck frame with header equal to blockAck and start its transmission.
an EUI-48 address
Definition: mac48-address.h:46
Implement the header for management frames of type Add Block Ack request.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
QosFrameExchangeManager handles the frame exchange sequences for QoS stations.
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:105
a unique identifier for an interface.
Definition: type-id.h:59
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:73
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: phy-entity.h:69
WifiAcknowledgment is an abstract base struct.