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  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
83  WifiMode GetSigAMode (void) const override;
84  WifiMode GetSigBMode (const WifiTxVector& txVector) const override;
85  const PpduFormats & GetPpduFormats (void) const override;
86  Time GetLSigDuration (WifiPreamble preamble) const override;
87  Time GetTrainingDuration (const WifiTxVector& txVector,
88  uint8_t nDataLtf,
89  uint8_t nExtensionLtf = 0) const override;
90  Time GetSigADuration (WifiPreamble preamble) const override;
91  Time GetSigBDuration (const WifiTxVector& txVector) const override;
93  const WifiTxVector& txVector,
94  Time ppduDuration) override;
97  RxPowerWattPerChannelBand rxPowersW,
98  Time rxDuration) override;
99  void CancelAllEvents (void) override;
100  uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const override;
101  uint16_t GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const override;
102  void StartTx (Ptr<WifiPpdu> ppdu) override;
103  Time CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const override;
104 
108  uint8_t GetBssColor (void) const;
109 
116  static uint16_t ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band);
124  static Time ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band);
130  Time CalculateNonOfdmaDurationForHeTb (const WifiTxVector& txVector) const;
131 
141  WifiSpectrumBand GetRuBandForTx (const WifiTxVector& txVector, uint16_t staId) const;
151  WifiSpectrumBand GetRuBandForRx (const WifiTxVector& txVector, uint16_t staId) const;
160  WifiSpectrumBand GetNonOfdmaBand (const WifiTxVector& txVector, uint16_t staId) const;
167  uint16_t GetNonOfdmaWidth (HeRu::RuSpec ru) const;
168 
172  uint64_t GetCurrentHeTbPpduUid (void) const;
173 
183  uint16_t GetCenterFrequencyForNonOfdmaPart (const WifiTxVector& txVector, uint16_t staId) const;
184 
191 
199  void NotifyEndOfHeSigA (HeSigAParameters params);
200 
204  static void InitializeModes (void);
212  static WifiMode GetHeMcs (uint8_t index);
213 
219  static WifiMode GetHeMcs0 (void);
225  static WifiMode GetHeMcs1 (void);
231  static WifiMode GetHeMcs2 (void);
237  static WifiMode GetHeMcs3 (void);
243  static WifiMode GetHeMcs4 (void);
249  static WifiMode GetHeMcs5 (void);
255  static WifiMode GetHeMcs6 (void);
261  static WifiMode GetHeMcs7 (void);
267  static WifiMode GetHeMcs8 (void);
273  static WifiMode GetHeMcs9 (void);
279  static WifiMode GetHeMcs10 (void);
285  static WifiMode GetHeMcs11 (void);
286 
295  static WifiCodeRate GetCodeRate (uint8_t mcsValue);
304  static uint16_t GetConstellationSize (uint8_t mcsValue);
318  static uint64_t GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
327  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
336  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
349  static uint64_t GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
358  static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
368  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
369 
370 protected:
371  PhyFieldRxStatus ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status) override;
372  PhyFieldRxStatus ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status) override;
374  bool IsConfigSupported (Ptr<const WifiPpdu> ppdu) const override;
375  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  Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
382  uint32_t GetMaxPsduSize (void) const override;
383  WifiConstPsduMap GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const override;
384 
392 
406  static uint64_t CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize);
411  static uint16_t GetUsableSubcarriers (uint16_t channelWidth);
412 
415 
416  std::map <uint16_t /* STA-ID */, EventId> m_beginOfdmaPayloadRxEvents;
417 
419 
420 private:
421  void BuildModeList (void) override;
422  uint8_t GetNumberBccEncoders (const WifiTxVector& txVector) const override;
423  Time GetSymbolDuration (const WifiTxVector& txVector) const override;
424 
433  static WifiMode CreateHeMcs (uint8_t index);
434 
436 }; //class HePhy
437 
438 } //namespace ns3
439 
440 #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:416
PHY entity for HE (11ax)HE PHY is based on VHT PHY.
Definition: he-phy.h:60
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:1045
static WifiMode GetHeMcs3(void)
Return MCS 3 from HE MCS values.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
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
RU Specification.
Definition: he-ru.h:67
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:413
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:892
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:1001
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
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:951
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
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:1145
uint64_t m_currentHeTbPpduUid
UID of the HE TB PPDU being received.
Definition: he-phy.h:414
Status of the reception of the PPDU field.
Definition: phy-entity.h:110
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:1081
WifiPpduField
The type of PPDU field (grouped for convenience)
uint64_t GetCurrentHeTbPpduUid(void) const
Definition: he-phy.cc:794
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
Definition: he-phy.cc:915
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:870
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
Definition: he-phy.h:418
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.
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.
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:1067
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:435
static void InitializeModes(void)
Initialize all HE modes.
Definition: he-phy.cc:942
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
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:1151
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:800
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:477
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:1123
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:1053
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
Definition: he-phy.cc:818
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:1115
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
uint32_t GetMaxPsduSize(void) const override
Get the maximum PSDU size in bytes.
Definition: he-phy.cc:1165
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
Definition: he-phy.cc:837
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:1018
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:782
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:1032
static uint16_t GetUsableSubcarriers(uint16_t channelWidth)
Definition: he-phy.cc:1092
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