A Discrete-Event Network Simulator
API
he-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 HE_FRAME_EXCHANGE_MANAGER_H
22 #define HE_FRAME_EXCHANGE_MANAGER_H
23 
24 #include "ns3/vht-frame-exchange-manager.h"
25 #include "mu-snr-tag.h"
26 #include <map>
27 #include <unordered_map>
28 
29 namespace ns3 {
30 
31 class MultiUserScheduler;
32 class ApWifiMac;
33 class StaWifiMac;
34 class CtrlTriggerHeader;
35 
39 typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
43 typedef std::unordered_map <uint16_t /* staId */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
44 
52 {
53 public:
58  static TypeId GetTypeId (void);
60  virtual ~HeFrameExchangeManager ();
61 
62  uint16_t GetSupportedBaBufferSize (void) const override;
63  bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
64  void SetWifiMac (const Ptr<WifiMac> mac) override;
65  void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
66  void SetTxopHolder (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) override;
67 
73  void SetMultiUserScheduler (const Ptr<MultiUserScheduler> muScheduler);
74 
83  static Ptr<WifiPsdu> GetPsduTo (Mac48Address to, const WifiPsduMap& psduMap);
84 
92  virtual void SetTargetRssi (CtrlTriggerHeader& trigger) const;
93 
94 protected:
95  void DoDispose () override;
96 
97  void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
98  const WifiTxVector& txVector, bool inAmpdu) override;
99  void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
100  const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus) override;
101  Time GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
102  const WifiTxParameters& txParams) const override;
103  bool SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
104  void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) override;
105  void BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector) override;
106  void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
107 
116  void SendPsduMapWithProtection (WifiPsduMap psduMap, WifiTxParameters& txParams);
117 
124  void ForwardPsduMapDown (WifiConstPsduMap psduMap, WifiTxVector& txVector);
125 
135  virtual void BlockAcksInTbPpduTimeout (WifiPsduMap* psduMap,
136  const std::set<Mac48Address>* staMissedBlockAckFrom,
137  std::size_t nSolicitedStations);
138 
148  virtual void TbPpduTimeout (WifiPsduMap* psduMap,
149  const std::set<Mac48Address>* staMissedTbPpduFrom,
150  std::size_t nSolicitedStations);
151 
159  virtual void BlockAckAfterTbPpduTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
160 
168  WifiTxVector GetTrigVector (const CtrlTriggerHeader& trigger) const;
169 
180  WifiTxVector GetHeTbTxVector (CtrlTriggerHeader trigger, Mac48Address triggerSender) const;
181 
194  Ptr<WifiMacQueueItem> PrepareMuBar (const WifiTxVector& responseTxVector,
195  std::map<uint16_t, CtrlBAckRequestHeader> recipients) const;
196 
202  void SendMultiStaBlockAck (const WifiTxParameters& txParams);
203 
212  void SendQosNullFramesInTbPpdu (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
213 
217 
218 private:
222  void SendPsduMap (void);
223 
230  void ReceiveBasicTrigger (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
231 
236  std::set<Mac48Address> m_staExpectTbPpduFrom;
240 };
241 
242 } //namespace ns3
243 
244 #endif /* HE_FRAME_EXCHANGE_MANAGER_H */
Headers for Trigger frames.
Definition: ctrl-headers.h:886
An identifier for simulation events.
Definition: event-id.h:54
HeFrameExchangeManager handles the frame exchange sequences for HE stations.
void NormalAckTimeout(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector) override
Called when the Ack timeout expires.
WifiTxVector GetTrigVector(const CtrlTriggerHeader &trigger) const
Get the TRIGVECTOR that the MAC has to pass to the PHY when transmitting the given Trigger Frame.
Ptr< ApWifiMac > m_apMac
MAC pointer (null if not an AP)
bool SendMpduFromBaManager(Ptr< QosTxop > edca, Time availableTime, bool initialFrame) override
If the Block Ack Manager associated with the given EDCA has a BlockAckReq frame to transmit (the dura...
void SendQosNullFramesInTbPpdu(const CtrlTriggerHeader &trigger, const WifiMacHeader &hdr)
Send QoS Null frames in response to a Basic or BSRP Trigger Frame.
void DoDispose() override
Destructor implementation.
WifiTxParameters m_txParams
the TX parameters for the current PPDU
Time GetTxDuration(uint32_t ppduPayloadSize, Mac48Address receiver, const WifiTxParameters &txParams) const override
Get the updated TX duration of the frame associated with the given TX parameters if the size of the P...
void BlockAckTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector) override
Called when the BlockAck timeout expires.
Ptr< WifiMacQueueItem > m_triggerFrame
Trigger Frame being sent.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
void SetMultiUserScheduler(const Ptr< MultiUserScheduler > muScheduler)
Set the Multi-user Scheduler associated with this Frame Exchange Manager.
virtual void TbPpduTimeout(WifiPsduMap *psduMap, const std::set< Mac48Address > *staMissedTbPpduFrom, std::size_t nSolicitedStations)
Take the necessary actions after that some TB PPDUs are missing in response to Trigger Frame.
void SetWifiMac(const Ptr< WifiMac > mac) override
Set the MAC layer to use.
bool m_triggerFrameInAmpdu
True if the received A-MPDU contains an MU-BAR.
Ptr< MultiUserScheduler > m_muScheduler
Multi-user Scheduler (HE APs only)
WifiTxVector m_trigVector
the TRIGVECTOR
virtual void SetTargetRssi(CtrlTriggerHeader &trigger) const
Set the UL Target RSSI subfield of every User Info fields of the given Trigger Frame to the most rece...
static Ptr< WifiPsdu > GetPsduTo(Mac48Address to, const WifiPsduMap &psduMap)
Get the PSDU in the given PSDU map that is addressed to the given MAC address, if any,...
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.
Ptr< StaWifiMac > m_staMac
MAC pointer (null if not a STA)
void SendMultiStaBlockAck(const WifiTxParameters &txParams)
Send a Multi-STA Block Ack frame after the reception of some TB PPDUs.
static TypeId GetTypeId(void)
Get the type ID.
MuSnrTag m_muSnrTag
Tag to attach to Multi-STA BlockAck frames.
void ForwardPsduMapDown(WifiConstPsduMap psduMap, WifiTxVector &txVector)
Forward a map of PSDUs down to the PHY layer.
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...
void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector) override
Called when the CTS timeout expires.
std::set< Mac48Address > m_staExpectTbPpduFrom
set of stations expected to send a TB PPDU
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 BlockAckAfterTbPpduTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Take the necessary actions after that a Block Ack is missing after a TB PPDU solicited through a Trig...
void SendPsduMap(void)
Send the current PSDU map as a DL MU PPDU.
uint16_t GetSupportedBaBufferSize(void) const override
Get the maximum supported buffer size for a Block Ack agreement.
WifiPsduMap m_psduMap
the A-MPDU being transmitted
virtual void BlockAcksInTbPpduTimeout(WifiPsduMap *psduMap, const std::set< Mac48Address > *staMissedBlockAckFrom, std::size_t nSolicitedStations)
Take the necessary actions after that some BlockAck frames are missing in response to a DL MU PPDU.
EventId m_multiStaBaEvent
Sending a Multi-STA BlockAck event.
void SetTxopHolder(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector) override
Set the TXOP holder, if needed, based on the received frame.
void SendPsduMapWithProtection(WifiPsduMap psduMap, WifiTxParameters &txParams)
Send a map of PSDUs as a DL MU PPDU.
void ReceiveBasicTrigger(const CtrlTriggerHeader &trigger, const WifiMacHeader &hdr)
Take the necessary actions when receiveing a Basic Trigger Frame.
WifiTxVector GetHeTbTxVector(CtrlTriggerHeader trigger, Mac48Address triggerSender) const
Return a TXVECTOR for the UL frame that the station will send in response to the given Trigger frame,...
Ptr< WifiMacQueueItem > PrepareMuBar(const WifiTxVector &responseTxVector, std::map< uint16_t, CtrlBAckRequestHeader > recipients) const
Build a MU-BAR Trigger Frame starting from the TXVECTOR used to respond to the MU-BAR (in case of mul...
an EUI-48 address
Definition: mac48-address.h:44
A tag to be attached to a response to a multi-user UL frame, that carries the SNR values with which t...
Definition: mu-snr-tag.h:36
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
a unique identifier for an interface.
Definition: type-id.h:59
VhtFrameExchangeManager handles the frame exchange sequences for VHT stations.
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...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
std::unordered_map< uint16_t, Ptr< WifiPsdu > > WifiPsduMap
Map of PSDUs indexed by STA-ID.
mac
Definition: third.py:99
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:67
WifiAcknowledgment is an abstract base struct.