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 */
An identifier for simulation events.
Definition: event-id.h:54
PHY entity for HE (11ax)
Definition: he-phy.h:61
const PpduFormats & GetPpduFormats(void) const override
Return the PPDU formats of the PHY.
Definition: he-phy.cc:164
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
static WifiMode GetHeMcs10(void)
Return MCS 10 from HE MCS values.
Time GetLSigDuration(WifiPreamble preamble) const override
Definition: he-phy.cc:170
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
Definition: he-phy.cc:263
void StartReceiveOfdmaPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
Definition: he-phy.cc:685
WifiMode GetSigAMode(void) const override
Definition: he-phy.cc:125
static WifiMode GetHeMcs5(void)
Return MCS 5 from HE MCS values.
static uint16_t ConvertHeTbPpduDurationToLSigLength(Time ppduDuration, WifiPhyBand band)
Definition: he-phy.cc:250
static WifiMode GetHeMcs4(void)
Return MCS 4 from HE MCS values.
Time GetSymbolDuration(const WifiTxVector &txVector) const override
Definition: he-phy.cc:298
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 WifiMode GetHeMcs3(void)
Return MCS 3 from HE MCS values.
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
Definition: he-phy.cc:369
static WifiMode GetHeMcs8(void)
Return MCS 8 from HE MCS values.
uint64_t m_currentHeTbPpduUid
UID of the HE TB PPDU being received.
Definition: he-phy.h:414
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
Definition: he-phy.cc:915
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
uint8_t GetBssColor(void) const
Definition: he-phy.cc:470
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW) override
Get the event corresponding to the incoming PPDU.
Definition: he-phy.cc:402
Time GetSigBDuration(const WifiTxVector &txVector) const override
Definition: he-phy.cc:193
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:1001
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:951
static uint16_t GetUsableSubcarriers(uint16_t channelWidth)
Definition: he-phy.cc:1092
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
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
void BuildModeList(void) override
Build mode list.
Definition: he-phy.cc:91
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
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
std::map< uint16_t, EventId > m_beginOfdmaPayloadRxEvents
the beginning of the OFDMA payload reception events (indexed by STA-ID)
Definition: he-phy.h:416
void SetEndOfHeSigACallback(EndOfHeSigACallback callback)
Set a callback for a end of HE-SIG-A.
Definition: he-phy.cc:545
uint64_t GetCurrentHeTbPpduUid(void) const
Definition: he-phy.cc:794
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
Definition: he-phy.h:413
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1018
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
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
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
Definition: he-phy.h:418
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
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
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
Definition: he-phy.cc:818
uint32_t GetMaxPsduSize(void) const override
Get the maximum PSDU size in bytes.
Definition: he-phy.cc:1165
Callback< void, HeSigAParameters > EndOfHeSigACallback
Callback upon end of HE-SIG-A.
Definition: he-phy.h:68
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
void CancelAllEvents(void) override
Cancel and clear all running events.
Definition: he-phy.cc:357
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
static WifiMode GetHeMcs0(void)
Return MCS 0 from HE MCS values.
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
static void InitializeModes(void)
Initialize all HE modes.
Definition: he-phy.cc:942
Time CalculateNonOfdmaDurationForHeTb(const WifiTxVector &txVector) const
Definition: he-phy.cc:282
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
Definition: he-phy.cc:292
static WifiMode GetHeMcs6(void)
Return MCS 6 from HE MCS values.
static WifiMode GetHeMcs2(void)
Return MCS 2 from HE MCS values.
static WifiMode GetHeMcs7(void)
Return MCS 7 from HE MCS values.
static WifiMode GetHeMcs1(void)
Return MCS 1 from HE MCS values.
static WifiMode GetHeMcs9(void)
Return MCS 9 from HE MCS values.
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Definition: he-phy.cc:306
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
Definition: he-phy.cc:551
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
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
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
static const PpduFormats m_hePpduFormats
HE PPDU formats.
Definition: he-phy.h:435
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
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
HePhy(bool buildModeList=true)
Constructor for HE PHY.
Definition: he-phy.cc:70
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
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 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
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
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
Definition: he-phy.cc:131
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
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
static WifiMode GetHeMcs11(void)
Return MCS 11 from HE MCS values.
Time GetSigADuration(WifiPreamble preamble) const override
Definition: he-phy.cc:187
Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
Definition: he-phy.cc:176
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
Definition: he-phy.cc:837
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
Definition: he-phy.cc:800
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1032
RU Specification.
Definition: he-ru.h:68
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
Definition: phy-entity.h:477
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
PHY entity for VHT (11ac)
Definition: vht-phy.h:49
represent a single transmission mode
Definition: wifi-mode.h:48
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:33
WifiPpduField
The type of PPDU field (grouped for convenience)
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::pair< uint32_t, uint32_t > WifiSpectrumBand
typedef for a pair of start and stop sub-band indexes
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
Definition: phy-entity.h:75
uint16_t WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
Parameters for received HE-SIG-A for OBSS_PD based SR.
Definition: he-phy.h:47
uint8_t bssColor
BSS color.
Definition: he-phy.h:49
double rssiW
RSSI in W.
Definition: he-phy.h:48
Status of the reception of the PPDU field.
Definition: phy-entity.h:111
#define SU_STA_ID
Definition: wifi-mode.h:32