A Discrete-Event Network Simulator
API
he-phy.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020 Orange Labs
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  * Authors: Rediet <getachew.redieteab@orange.com>
19  * S├ębastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and spectrum-wifi-phy)
20  */
21 
22 #ifndef HE_PHY_H
23 #define HE_PHY_H
24 
25 #include "ns3/vht-phy.h"
26 #include "ns3/wifi-phy-band.h"
27 #include "ns3/callback.h"
28 
36 namespace ns3 {
37 
41 #define HE_PHY 125
42 
47 {
48  double rssiW;
49  uint8_t bssColor;
50 };
51 
60 class HePhy : public VhtPhy
61 {
62 public:
69 
76  HePhy (bool buildModeList = true);
80  virtual ~HePhy ();
81 
82  // Inherited
83  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
84  WifiMode GetSigAMode (void) const override;
85  WifiMode GetSigBMode (const WifiTxVector& txVector) const override;
86  virtual const PpduFormats & GetPpduFormats (void) const override;
87  Time GetLSigDuration (WifiPreamble preamble) const override;
88  virtual Time GetTrainingDuration (const WifiTxVector& txVector,
89  uint8_t nDataLtf, uint8_t nExtensionLtf = 0) const override;
90  Time GetSigADuration (WifiPreamble preamble) const override;
91  Time GetSigBDuration (const WifiTxVector& txVector) const override;
92  virtual Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration) override;
95  Time rxDuration) override;
96  void CancelAllEvents (void) override;
97  virtual uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const override;
98  uint16_t GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const override;
99  void StartTx (Ptr<WifiPpdu> ppdu) override;
100  uint16_t GetTransmissionChannelWidth (Ptr<const WifiPpdu> ppdu) const override;
101  Time CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const override;
102  virtual bool CanReceivePpdu (Ptr<WifiPpdu> ppdu, uint16_t txCenterFreq) const override;
103 
107  uint8_t GetBssColor (void) const;
108 
115  static uint16_t ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band);
123  static Time ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band);
129  Time CalculateNonOfdmaDurationForHeTb (const WifiTxVector& txVector) const;
130 
140  WifiSpectrumBand GetRuBandForTx (const WifiTxVector& txVector, uint16_t staId) const;
150  WifiSpectrumBand GetRuBandForRx (const WifiTxVector& txVector, uint16_t staId) const;
159  WifiSpectrumBand GetNonOfdmaBand (const WifiTxVector& txVector, uint16_t staId) const;
166  uint16_t GetNonOfdmaWidth (HeRu::RuSpec ru) const;
167 
171  uint64_t GetCurrentHeTbPpduUid (void) const;
172 
182  uint16_t GetCenterFrequencyForNonOfdmaPart (const WifiTxVector& txVector, uint16_t staId) const;
183 
190 
198  void NotifyEndOfHeSigA (HeSigAParameters params);
199 
203  static void InitializeModes (void);
211  static WifiMode GetHeMcs (uint8_t index);
212 
218  static WifiMode GetHeMcs0 (void);
224  static WifiMode GetHeMcs1 (void);
230  static WifiMode GetHeMcs2 (void);
236  static WifiMode GetHeMcs3 (void);
242  static WifiMode GetHeMcs4 (void);
248  static WifiMode GetHeMcs5 (void);
254  static WifiMode GetHeMcs6 (void);
260  static WifiMode GetHeMcs7 (void);
266  static WifiMode GetHeMcs8 (void);
272  static WifiMode GetHeMcs9 (void);
278  static WifiMode GetHeMcs10 (void);
284  static WifiMode GetHeMcs11 (void);
285 
294  static WifiCodeRate GetCodeRate (uint8_t mcsValue);
303  static uint16_t GetConstellationSize (uint8_t mcsValue);
317  static uint64_t GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
326  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
335  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
348  static uint64_t GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
357  static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
367  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
368 
369 protected:
370  // Inherited
371  PhyFieldRxStatus ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status) override;
372  PhyFieldRxStatus ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status) override;
374  virtual bool IsConfigSupported (Ptr<const WifiPpdu> ppdu) const override;
375  virtual void DoStartReceivePayload (Ptr<Event> event) override;
376  std::pair<uint16_t, WifiSpectrumBand> GetChannelWidthAndBand (const WifiTxVector& txVector, uint16_t staId) const override;
377  void DoEndReceivePayload (Ptr<const WifiPpdu> ppdu) override;
378  void DoResetReceive (Ptr<Event> event) override;
379  void DoAbortCurrentReception (WifiPhyRxfailureReason reason) override;
380  uint64_t ObtainNextUid (const WifiTxVector& txVector) override;
381  virtual Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
382 
390 
404  static uint64_t CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize);
409  static uint16_t GetUsableSubcarriers (uint16_t channelWidth);
410 
417  virtual uint32_t GetMaxPsduSize (void) const override;
418 
419  virtual WifiConstPsduMap GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const override;
420 
423 
424  std::map <uint16_t /* STA-ID */, EventId> m_beginOfdmaPayloadRxEvents;
425 
427 private:
428  // Inherited
429  virtual void BuildModeList (void) override;
430  uint8_t GetNumberBccEncoders (const WifiTxVector& txVector) const override;
431  virtual Time GetSymbolDuration (const WifiTxVector& txVector) const override;
432 
441  static WifiMode CreateHeMcs (uint8_t index);
442 
444 }; //class HePhy
445 
446 } //namespace ns3
447 
448 #endif /* HE_PHY_H */
std::map< uint16_t, EventId > m_beginOfdmaPayloadRxEvents
the beginning of the OFDMA payload reception events (indexed by STA-ID)
Definition: he-phy.h:424
PHY entity for HE (11ax)HE PHY is based on VHT PHY.
Definition: he-phy.h:60
virtual const PpduFormats & GetPpduFormats(void) const override
Return the PPDU formats of the PHY.
Definition: he-phy.cc:164
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
static uint64_t GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
Return the PHY rate corresponding to the supplied HE MCS index, channel width, guard interval...
Definition: he-phy.cc:1077
static WifiMode GetHeMcs3(void)
Return MCS 3 from HE MCS values.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
virtual Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Definition: he-phy.cc:306
Parameters for received HE-SIG-A for OBSS_PD based SR.
Definition: he-phy.h:46
static uint16_t ConvertHeTbPpduDurationToLSigLength(Time ppduDuration, WifiPhyBand band)
Definition: he-phy.cc:250
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received. ...
Definition: he-phy.cc:551
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Time CalculateNonOfdmaDurationForHeTb(const WifiTxVector &txVector) const
Definition: he-phy.cc:282
std::pair< uint16_t, WifiSpectrumBand > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const override
Get the channel width and band to use (will be overloaded by child classes).
Definition: he-phy.cc:714
void StartReceiveOfdmaPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
Definition: he-phy.cc:685
HePhy(bool buildModeList=true)
Constructor for HE PHY.
Definition: he-phy.cc:70
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
Definition: he-phy.h:421
virtual Time GetSymbolDuration(const WifiTxVector &txVector) const override
Definition: he-phy.cc:298
PhyFieldRxStatus ProcessSigB(Ptr< Event > event, PhyFieldRxStatus status) override
Process SIG-B, perform amendment-specific actions, and provide an updated status of the reception...
Definition: he-phy.cc:560
static WifiMode GetHeMcs8(void)
Return MCS 8 from HE MCS values.
void StartTx(Ptr< WifiPpdu > ppdu) override
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
Definition: he-phy.cc:890
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
Definition: he-phy.cc:104
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:1033
virtual bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const override
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
Definition: he-phy.cc:576
void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu) override
Perform amendment-specific actions at the end of the reception of the payload.
Definition: he-phy.cc:655
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
static WifiMode GetHeMcs0(void)
Return MCS 0 from HE MCS values.
void DoResetReceive(Ptr< Event > event) override
Perform amendment-specific actions before resetting PHY at the end of the PPDU under reception after ...
Definition: he-phy.cc:387
virtual bool CanReceivePpdu(Ptr< WifiPpdu > ppdu, uint16_t txCenterFreq) const override
Check whether the given PPDU can be received by this PHY entity.
Definition: he-phy.cc:934
uint8_t bssColor
BSS color.
Definition: he-phy.h:49
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:983
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
Definition: he-phy.cc:263
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:47
static WifiMode GetHeMcs6(void)
Return MCS 6 from HE MCS values.
virtual ~HePhy()
Destructor for HE PHY.
Definition: he-phy.cc:85
virtual void DoStartReceivePayload(Ptr< Event > event) override
Start receiving the PSDU (i.e.
Definition: he-phy.cc:608
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
static bool IsModeAllowed(uint16_t channelWidth, uint8_t nss)
Check whether the combination of <MCS, channel width, NSS> is allowed.
Definition: he-phy.cc:1177
uint64_t m_currentHeTbPpduUid
UID of the HE TB PPDU being received.
Definition: he-phy.h:422
Status of the reception of the PPDU field.
Definition: phy-entity.h:110
RU Specification.
Definition: he-ru.h:64
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
Definition: he-phy.cc:131
static uint64_t GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
Return the data rate corresponding to the supplied HE MCS index, channel width, guard interval...
Definition: he-phy.cc:1113
WifiPpduField
The type of PPDU field (grouped for convenience)
uint64_t GetCurrentHeTbPpduUid(void) const
Definition: he-phy.cc:793
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
Definition: he-phy.cc:947
std::pair< uint32_t, uint32_t > WifiSpectrumBand
typedef for a pair of start and stop sub-band indexes
uint16_t GetCenterFrequencyForNonOfdmaPart(const WifiTxVector &txVector, uint16_t staId) const
Get the center frequency of the non-OFDMA part of the current TxVector for the given STA-ID...
Definition: he-phy.cc:869
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
Definition: he-phy.h:426
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
Definition: he-phy.cc:369
Time GetSigADuration(WifiPreamble preamble) const override
Definition: he-phy.cc:187
uint16_t WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
void SetEndOfHeSigACallback(EndOfHeSigACallback callback)
Set a callback for a end of HE-SIG-A.
Definition: he-phy.cc:545
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static WifiMode GetHeMcs1(void)
Return MCS 1 from HE MCS values.
virtual Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
Definition: he-phy.cc:176
static WifiMode GetHeMcs11(void)
Return MCS 11 from HE MCS values.
virtual void BuildModeList(void) override
Build mode list.
Definition: he-phy.cc:91
static uint64_t GetDataRateFromTxVector(const WifiTxVector &txVector, uint16_t staId=SU_STA_ID)
Return the data rate corresponding to the supplied TXVECTOR for the STA-ID.
Definition: he-phy.cc:1099
WifiSpectrumBand GetRuBandForTx(const WifiTxVector &txVector, uint16_t staId) const
Get the band in the TX spectrum associated with the RU used by the PSDU transmitted to/by a given STA...
Definition: he-phy.cc:728
Callback< void, HeSigAParameters > EndOfHeSigACallback
Callback upon end of HE-SIG-A.
Definition: he-phy.h:68
static WifiMode GetHeMcs4(void)
Return MCS 4 from HE MCS values.
static const PpduFormats m_hePpduFormats
HE PPDU formats.
Definition: he-phy.h:443
static void InitializeModes(void)
Initialize all HE modes.
Definition: he-phy.cc:974
Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const override
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
Definition: he-phy.cc:458
virtual WifiConstPsduMap GetWifiConstPsduMap(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector) const override
Get a WifiConstPsduMap from a PSDU and the TXVECTOR to use to send the PSDU.
Definition: he-phy.cc:1183
WifiSpectrumBand GetRuBandForRx(const WifiTxVector &txVector, uint16_t staId) const
Get the band in the RX spectrum associated with the RU used by the PSDU transmitted to/by a given STA...
Definition: he-phy.cc:745
double rssiW
RSSI in W.
Definition: he-phy.h:48
WifiMode GetSigAMode(void) const override
Definition: he-phy.cc:125
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:32
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
Definition: he-phy.cc:799
An identifier for simulation events.
Definition: event-id.h:53
static WifiMode GetHeMcs5(void)
Return MCS 5 from HE MCS values.
void CancelAllEvents(void) override
Cancel and clear all running events.
Definition: he-phy.cc:357
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
Definition: phy-entity.h:499
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW) override
Get the event corresponding to the incoming PPDU.
Definition: he-phy.cc:402
PHY entity for VHT (11ac)VHT PHY is based on HT PHY.
Definition: vht-phy.h:48
Time GetSigBDuration(const WifiTxVector &txVector) const override
Definition: he-phy.cc:193
static WifiMode GetHeMcs7(void)
Return MCS 7 from HE MCS values.
static uint64_t CalculateNonHtReferenceRate(WifiCodeRate codeRate, uint16_t constellationSize)
Return the rate (in bps) of the non-HT Reference Rate which corresponds to the supplied code rate and...
Definition: he-phy.cc:1155
virtual uint16_t GetStaId(const Ptr< const WifiPpdu > ppdu) const override
Return the STA ID that has been assigned to the station this PHY belongs to.
Definition: he-phy.cc:486
static uint64_t GetPhyRateFromTxVector(const WifiTxVector &txVector, uint16_t staId=SU_STA_ID)
Return the PHY rate corresponding to the supplied TXVECTOR for the STA-ID.
Definition: he-phy.cc:1085
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
Definition: he-phy.cc:817
uint8_t GetBssColor(void) const
Definition: he-phy.cc:470
static uint64_t GetNonHtReferenceRate(uint8_t mcsValue)
Calculate the rate in bps of the non-HT Reference Rate corresponding to the supplied HE MCS index...
Definition: he-phy.cc:1147
static WifiMode GetHeMcs10(void)
Return MCS 10 from HE MCS values.
PhyFieldRxStatus ProcessSigA(Ptr< Event > event, PhyFieldRxStatus status) override
Process SIG-A, perform amendment-specific actions, and provide an updated status of the reception...
Definition: he-phy.cc:508
virtual uint32_t GetMaxPsduSize(void) const override
Get the maximum PSDU size in bytes (see Table 27-55 HE PHY characteristics of IEEE 802...
Definition: he-phy.cc:1197
virtual Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
Definition: he-phy.cc:836
static WifiMode GetHeMcs9(void)
Return MCS 9 from HE MCS values.
void StartReceivePreamble(Ptr< WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration) override
Start receiving the PHY preamble of a PPDU (i.e.
Definition: he-phy.cc:317
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1050
uint16_t GetNonOfdmaWidth(HeRu::RuSpec ru) const
Get the width in MHz of the non-OFDMA portion of an HE TB PPDU.
Definition: he-phy.cc:781
uint16_t GetTransmissionChannelWidth(Ptr< const WifiPpdu > ppdu) const override
Get the channel width over which the PPDU will be effectively be transmitted.
Definition: he-phy.cc:913
WifiSpectrumBand GetNonOfdmaBand(const WifiTxVector &txVector, uint16_t staId) const
Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
Definition: he-phy.cc:762
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1064
static uint16_t GetUsableSubcarriers(uint16_t channelWidth)
Definition: he-phy.cc:1124
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
#define SU_STA_ID
Definition: wifi-mode.h:32
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
Definition: phy-entity.h:75
static WifiMode GetHeMcs2(void)
Return MCS 2 from HE MCS values.
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
Definition: he-phy.cc:292
Time GetLSigDuration(WifiPreamble preamble) const override
Definition: he-phy.cc:170