A Discrete-Event Network Simulator
API
ht-frame-exchange-manager.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
4  *
5  * 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  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * 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  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Stefano Avallone <stavallo@unina.it>
19  */
20 
21 #ifndef HT_FRAME_EXCHANGE_MANAGER_H
22 #define HT_FRAME_EXCHANGE_MANAGER_H
23 
24 #include "ns3/qos-frame-exchange-manager.h"
25 #include "ns3/mpdu-aggregator.h"
26 #include "ns3/msdu-aggregator.h"
27 #include "ns3/wifi-psdu.h"
28 
31 class HeAggregationTest;
32 
33 namespace ns3 {
34 
35 class MgtAddBaResponseHeader;
36 class RecipientBlockAckAgreement;
37 
45 {
46 public:
48  friend class ::AmpduAggregationTest;
50  friend class ::TwoLevelAggregationTest;
52  friend class ::HeAggregationTest;
53 
58  static TypeId GetTypeId (void);
60  virtual ~HtFrameExchangeManager ();
61 
62  bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
63  void SetWifiMac (const Ptr<WifiMac> mac) override;
64  void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
65 
78 
91  const WifiTxParameters& txParams,
92  Time ppduDurationLimit) const override;
93 
105  virtual bool IsWithinAmpduSizeLimit (uint32_t ampduSize, Mac48Address receiver, uint8_t tid,
106  WifiModulationClass modulation) const;
107 
122  virtual bool TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu, WifiTxParameters& txParams,
123  Time availableTime) const;
124 
137  const WifiTxParameters& txParams,
138  Time ppduDurationLimit) const;
139 
155  void CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr,
156  Mac48Address originator, uint16_t startingSeq);
163  void DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid);
171  void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr,
172  Mac48Address originator);
179  virtual uint16_t GetSupportedBaBufferSize (void) const;
180 
190  bool GetBaAgreementEstablished (Mac48Address originator, uint8_t tid) const;
191 
199  BlockAckType GetBlockAckType (Mac48Address originator, uint8_t tid) const;
200 
209  void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
210 
211 protected:
212  void DoDispose () override;
213 
214  void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
215  const WifiTxVector& txVector, bool inAmpdu) override;
216  void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
217  const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus) override;
218  void NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu) override;
220  void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const override;
221  void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const override;
222  void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector) override;
223  void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
224  void TransmissionSucceeded (void) override;
225 
233  virtual Ptr<WifiPsdu> GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const;
234 
241  Ptr<BlockAckManager> GetBaManager (uint8_t tid) const;
242 
250  virtual Time GetPsduDurationId (Time txDuration, const WifiTxParameters& txParams) const;
251 
262 
269  virtual void NotifyTxToEdca (Ptr<const WifiPsdu> psdu) const;
270 
278  virtual void ForwardPsduDown (Ptr<const WifiPsdu> psdu, WifiTxVector& txVector);
279 
285  void DequeuePsdu (Ptr<const WifiPsdu> psdu);
286 
301  virtual bool SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame);
302 
317  virtual bool SendDataFrame (Ptr<const WifiMacQueueItem> peekedItem,
318  Time availableTime, bool initialFrame);
319 
332  virtual bool NeedSetupBlockAck (Mac48Address recipient, uint8_t tid);
333 
344  void SendAddBaRequest (Mac48Address recipient, uint8_t tid, uint16_t startingSeq,
345  uint16_t timeout, bool immediateBAck);
346 
355  void SendBlockAck (const RecipientBlockAckAgreement& agreement, Time durationId,
356  WifiTxVector& blockAckTxVector, double rxSnr);
357 
364  virtual void BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
365 
374  virtual void MissedBlockAck (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector, bool& resetCw);
375 
377  typedef std::pair<Mac48Address, uint8_t> AgreementKey;
378 
379  std::map<AgreementKey, RecipientBlockAckAgreement> m_agreements;
382 
383 private:
388  void SendPsdu (void);
389 
392 };
393 
394 } //namespace ns3
395 
396 #endif /* HT_FRAME_EXCHANGE_MANAGER_H */
Ampdu Aggregation Test.
802.11ax aggregation test which permits 64 or 256 MPDUs in A-MPDU according to the negociated buffer ...
Two Level Aggregation Test.
HtFrameExchangeManager handles the frame exchange sequences for HT stations.
Ptr< MpduAggregator > m_mpduAggregator
A-MPDU aggregator.
virtual uint16_t GetSupportedBaBufferSize(void) const
Get the maximum supported buffer size for a Block Ack agreement.
void SendAddBaRequest(Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck)
Sends an ADDBA Request to establish a block ack agreement with STA addressed by recipient for TID tid...
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.
Ptr< MpduAggregator > GetMpduAggregator(void) const
Returns the aggregator used to construct A-MPDU subframes.
void SendAddBaResponse(const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
This method can be called to accept a received ADDBA Request.
virtual bool SendMpduFromBaManager(Ptr< QosTxop > edca, Time availableTime, bool initialFrame)
If the Block Ack Manager associated with the given EDCA has a BlockAckReq frame to transmit (the dura...
void SendPsdu(void)
Send the current PSDU, which can be acknowledged by a BlockAck frame or followed by a BlockAckReq fra...
virtual Ptr< WifiPsdu > GetWifiPsdu(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector) const
Get a PSDU containing the given MPDU.
void DestroyBlockAckAgreement(Mac48Address originator, uint8_t tid)
Destroy a Block Ack agreement.
static TypeId GetTypeId(void)
Get the type ID.
void ForwardMpduDown(Ptr< WifiMacQueueItem > mpdu, WifiTxVector &txVector) override
Forward an MPDU down to the PHY layer.
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.
void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const override
Retransmit an MPDU that was not acknowledged.
virtual void BlockAckTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Called when the BlockAck timeout expires.
virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters &txParams) const
Compute how to set the Duration/ID field of PSDUs that do not include fragments.
void CreateBlockAckAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address originator, uint16_t startingSeq)
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...
Ptr< MsduAggregator > GetMsduAggregator(void) const
Returns the aggregator used to construct A-MSDU subframes.
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 NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu) override
Notify other components that an MPDU was acknowledged.
void SendPsduWithProtection(Ptr< WifiPsdu > psdu, WifiTxParameters &txParams)
Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or a BlockAckReq frame followed...
bool GetBaAgreementEstablished(Mac48Address originator, uint8_t tid) const
Return true if a Block Ack agreement has been established with the given originator for the given TID...
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 DoDispose() override
Destructor implementation.
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
void ReleaseSequenceNumber(Ptr< WifiMacQueueItem > mpdu) const override
Make the sequence number of the given MPDU available again if the MPDU has never been transmitted.
virtual bool TryAggregateMsdu(Ptr< const WifiMacQueueItem > 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...
void ReceiveMpdu(Ptr< WifiMacQueueItem > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu) override
This method handles the reception of an MPDU (possibly included in an A-MPDU)
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 IsWithinLimitsIfAggregateMsdu(Ptr< const WifiMacQueueItem > 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...
std::map< AgreementKey, RecipientBlockAckAgreement > m_agreements
agreements
virtual void ForwardPsduDown(Ptr< const WifiPsdu > psdu, WifiTxVector &txVector)
Forward a PSDU down to the PHY layer.
void TransmissionSucceeded(void) override
Take necessary actions upon a transmission success.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
virtual bool SendDataFrame(Ptr< const WifiMacQueueItem > 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...
bool IsWithinLimitsIfAddMpdu(Ptr< const WifiMacQueueItem > 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...
BlockAckType GetBlockAckType(Mac48Address originator, uint8_t tid) const
Get the type of BlockAck frames sent to the given originator.
void NotifyPacketDiscarded(Ptr< const WifiMacQueueItem > mpdu) override
Pass the given MPDU, discarded because of the max retry limit was reached, to the MPDU dropped callba...
void DequeuePsdu(Ptr< const WifiPsdu > psdu)
Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
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 CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector) override
Called when the CTS timeout expires.
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:44
Implement the header for management frames of type Add Block Ack request.
Definition: mgt-headers.h:1018
Implement the header for management frames of type Add Block Ack response.
Definition: mgt-headers.h:1150
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:103
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....
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mac
Definition: third.py:99
ns3::Time timeout
The different BlockAck variants.
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:67
WifiAcknowledgment is an abstract base struct.