A Discrete-Event Network Simulator
API
he-phy.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Orange Labs
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Authors: Rediet <getachew.redieteab@orange.com>
18 * Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and
19 * spectrum-wifi-phy)
20 */
21
22#ifndef HE_PHY_H
23#define HE_PHY_H
24
25#include "ns3/callback.h"
26#include "ns3/vht-phy.h"
27#include "ns3/wifi-phy-band.h"
28
36namespace ns3
37{
38
39class ObssPdAlgorithm;
40
44#define HE_PHY 122
45
50{
51 double rssiW;
52 uint8_t bssColor;
53};
54
63class HePhy : public VhtPhy
64{
65 public:
72
79 HePhy(bool buildModeList = true);
83 ~HePhy() override;
84
85 WifiMode GetSigMode(WifiPpduField field, const WifiTxVector& txVector) const override;
86 WifiMode GetSigAMode() const override;
87 WifiMode GetSigBMode(const WifiTxVector& txVector) const override;
88 const PpduFormats& GetPpduFormats() const override;
89 Time GetLSigDuration(WifiPreamble preamble) const override;
91 uint8_t nDataLtf,
92 uint8_t nExtensionLtf = 0) const override;
93 Time GetSigADuration(WifiPreamble preamble) const override;
94 Time GetSigBDuration(const WifiTxVector& txVector) const override;
96 const WifiTxVector& txVector,
97 Time ppduDuration) override;
100 RxPowerWattPerChannelBand& rxPowersW,
101 Time rxDuration) override;
102 void CancelAllEvents() override;
103 uint16_t GetStaId(const Ptr<const WifiPpdu> ppdu) const override;
104 uint16_t GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const override;
105 void StartTx(Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector) override;
107 const WifiTxVector& txVector,
108 WifiPhyBand band) const override;
109 void SwitchMaybeToCcaBusy(const Ptr<const WifiPpdu> ppdu) override;
110 double GetCcaThreshold(const Ptr<const WifiPpdu> ppdu,
111 WifiChannelListType channelType) const override;
112 void NotifyCcaBusy(const Ptr<const WifiPpdu> ppdu,
113 Time duration,
114 WifiChannelListType channelType) override;
115
119 uint8_t GetBssColor() const;
120
132 static std::pair<uint16_t, Time> ConvertHeTbPpduDurationToLSigLength(
133 Time ppduDuration,
134 const WifiTxVector& txVector,
135 WifiPhyBand band);
143 static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length,
144 const WifiTxVector& txVector,
145 WifiPhyBand band);
152
159
169 WifiSpectrumBand GetRuBandForTx(const WifiTxVector& txVector, uint16_t staId) const;
179 WifiSpectrumBand GetRuBandForRx(const WifiTxVector& txVector, uint16_t staId) const;
188 WifiSpectrumBand GetNonOfdmaBand(const WifiTxVector& txVector, uint16_t staId) const;
195 uint16_t GetNonOfdmaWidth(HeRu::RuSpec ru) const;
196
200 uint64_t GetCurrentHeTbPpduUid() const;
201
209 void SetTrigVector(const WifiTxVector& trigVector, Time validity);
210
220 uint16_t GetCenterFrequencyForNonOfdmaPart(const WifiTxVector& txVector, uint16_t staId) const;
221
227 void SetObssPdAlgorithm(const Ptr<ObssPdAlgorithm> algorithm);
228
235
244
248 static void InitializeModes();
256 static WifiMode GetHeMcs(uint8_t index);
257
330
339 static WifiCodeRate GetCodeRate(uint8_t mcsValue);
348 static uint16_t GetConstellationSize(uint8_t mcsValue);
362 static uint64_t GetPhyRate(uint8_t mcsValue,
363 uint16_t channelWidth,
364 uint16_t guardInterval,
365 uint8_t nss);
374 static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector,
375 uint16_t staId = SU_STA_ID);
384 static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector,
385 uint16_t staId = SU_STA_ID);
398 static uint64_t GetDataRate(uint8_t mcsValue,
399 uint16_t channelWidth,
400 uint16_t guardInterval,
401 uint8_t nss);
410 static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
418 static bool IsAllowed(const WifiTxVector& txVector);
419
425 static uint32_t GetSigBFieldSize(const WifiTxVector& txVector);
426
427 protected:
429 PhyFieldRxStatus status,
430 WifiPpduField field) override;
432 bool IsConfigSupported(Ptr<const WifiPpdu> ppdu) const override;
433 Time DoStartReceivePayload(Ptr<Event> event) override;
434 std::pair<uint16_t, WifiSpectrumBand> GetChannelWidthAndBand(const WifiTxVector& txVector,
435 uint16_t staId) const override;
437 RxSignalInfo rxSignalInfo,
438 const WifiTxVector& txVector,
439 uint16_t staId,
440 const std::vector<bool>& statusPerMpdu) override;
442 double snr,
443 const WifiTxVector& txVector) override;
444 void DoEndReceivePayload(Ptr<const WifiPpdu> ppdu) override;
445 void DoResetReceive(Ptr<Event> event) override;
447 uint64_t ObtainNextUid(const WifiTxVector& txVector) override;
450 const WifiTxVector& txVector) const override;
451 uint32_t GetMaxPsduSize() const override;
453 const WifiTxVector& txVector) const override;
454
465
476
485
499 static uint64_t CalculateNonHtReferenceRate(WifiCodeRate codeRate, uint16_t constellationSize);
500
505 static uint16_t GetUsableSubcarriers(uint16_t channelWidth);
506
511 static Time GetSymbolDuration(Time guardInterval);
512
516
517 std::map<uint16_t /* STA-ID */, EventId>
520
524
525 private:
526 void BuildModeList() override;
527 uint8_t GetNumberBccEncoders(const WifiTxVector& txVector) const override;
528 Time GetSymbolDuration(const WifiTxVector& txVector) const override;
529
537 void NotifyCcaBusy(Time duration,
538 WifiChannelListType channelType,
539 const std::vector<Time>& per20MHzDurations);
540
551 std::vector<Time> GetPer20MHzDurations(const Ptr<const WifiPpdu> ppdu);
552
561 static WifiMode CreateHeMcs(uint8_t index);
562
573 static Time GetValidPpduDuration(Time ppduDuration,
574 const WifiTxVector& txVector,
575 WifiPhyBand band);
576
578
579 std::size_t m_rxHeTbPpdus;
581 std::vector<Time> m_lastPer20MHzDurations;
582}; // class HePhy
583
584} // namespace ns3
585
586#endif /* HE_PHY_H */
An identifier for simulation events.
Definition: event-id.h:55
PHY entity for HE (11ax)
Definition: he-phy.h:64
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector) const override
Definition: he-phy.cc:1247
Time GetLSigDuration(WifiPreamble preamble) const override
Definition: he-phy.cc:184
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
Definition: he-phy.cc:274
static WifiMode GetHeMcs8()
Return MCS 8 from HE MCS values.
void StartReceiveOfdmaPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
Definition: he-phy.cc:892
uint64_t GetCurrentHeTbPpduUid() const
Definition: he-phy.cc:1026
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW) override
Get the event corresponding to the incoming PPDU.
Definition: he-phy.cc:442
void CancelAllEvents() override
Cancel and clear all running events.
Definition: he-phy.cc:397
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:987
void SetObssPdAlgorithm(const Ptr< ObssPdAlgorithm > algorithm)
Sets the OBSS-PD algorithm.
Definition: he-phy.cc:673
static void InitializeModes()
Initialize all HE modes.
Definition: he-phy.cc:1435
static WifiMode GetHeMcs9()
Return MCS 9 from HE MCS values.
static uint32_t GetSigBFieldSize(const WifiTxVector &txVector)
Get variable length HE SIG-B field size based on TX Vector.
Definition: he-phy.cc:1670
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
Definition: he-phy.cc:409
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
Definition: he-phy.cc:1400
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:934
static WifiMode GetHeMcs11()
Return MCS 11 from HE MCS values.
virtual PhyFieldRxStatus ProcessSigB(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-B, perform amendment-specific actions, and provide an updated status of the reception.
Definition: he-phy.cc:694
Time GetSigBDuration(const WifiTxVector &txVector) const override
Definition: he-phy.cc:219
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:1493
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:1444
static WifiMode GetHeMcs0()
Return MCS 0 from HE MCS values.
void BuildModeList() override
Build mode list.
Definition: he-phy.cc:103
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:1650
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:1014
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:1621
std::map< uint16_t, EventId > m_beginOfdmaPayloadRxEvents
the beginning of the OFDMA payload reception events (indexed by STA-ID)
Definition: he-phy.h:518
void SetEndOfHeSigACallback(EndOfHeSigACallback callback)
Set a callback for a end of HE-SIG-A.
Definition: he-phy.cc:679
Time m_trigVectorExpirationTime
expiration time of the TRIGVECTOR
Definition: he-phy.h:523
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
Definition: he-phy.h:513
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1509
static WifiMode GetHeMcs6()
Return MCS 6 from HE MCS values.
PhyFieldRxStatus ProcessSig(Ptr< Event > event, PhyFieldRxStatus status, WifiPpduField field) override
Process SIG-A or SIG-B, perform amendment-specific actions, and provide an updated status of the rece...
Definition: he-phy.cc:569
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:966
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
Definition: he-phy.h:521
static WifiMode GetHeMcs4()
Return MCS 4 from HE MCS values.
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:524
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:116
const PpduFormats & GetPpduFormats() const override
Return the PPDU formats of the PHY.
Definition: he-phy.cc:178
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
Definition: he-phy.cc:1226
WifiTxVector m_trigVector
the TRIGVECTOR
Definition: he-phy.h:522
static WifiMode GetHeMcs10()
Return MCS 10 from HE MCS values.
Callback< void, HeSigAParameters > EndOfHeSigACallback
Callback upon end of HE-SIG-A.
Definition: he-phy.h:71
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:1544
Ptr< ObssPdAlgorithm > m_obssPdAlgorithm
OBSS-PD algorithm.
Definition: he-phy.h:580
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:1344
Time CalculateNonOfdmaDurationForHeTb(const WifiTxVector &txVector) const
Definition: he-phy.cc:288
uint8_t GetBssColor() const
Definition: he-phy.cc:536
static Time GetValidPpduDuration(Time ppduDuration, const WifiTxVector &txVector, WifiPhyBand band)
Given a PPDU duration value, the TXVECTOR used to transmit the PPDU and the PHY band,...
Definition: he-phy.cc:242
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
Definition: he-phy.cc:309
static bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
Definition: he-phy.cc:1644
std::size_t m_rxHeTbPpdus
Number of successfully received HE TB PPDUS.
Definition: he-phy.h:579
~HePhy() override
Destructor for HE PHY.
Definition: he-phy.cc:97
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Definition: he-phy.cc:331
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
Definition: he-phy.cc:685
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:1572
static WifiMode GetHeMcs7()
Return MCS 7 from HE MCS values.
Time CalculateNonOfdmaDurationForHeMu(const WifiTxVector &txVector) const
Definition: he-phy.cc:298
void RxPayloadSucceeded(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, uint16_t staId, const std::vector< bool > &statusPerMpdu) override
Perform amendment-specific actions when the payload is successfully received.
Definition: he-phy.cc:820
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:1536
uint64_t m_currentMuPpduUid
UID of the HE MU or HE TB PPDU being received.
Definition: he-phy.h:515
static WifiMode GetHeMcs3()
Return MCS 3 from HE MCS values.
uint32_t GetMaxPsduSize() const override
Get the maximum PSDU size in bytes.
Definition: he-phy.cc:1664
void StartTx(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector) override
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
Definition: he-phy.cc:1369
static const PpduFormats m_hePpduFormats
HE PPDU formats.
Definition: he-phy.h:577
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:1558
std::vector< Time > GetPer20MHzDurations(const Ptr< const WifiPpdu > ppdu)
Compute the per-20 MHz CCA durations vector that indicates for how long each 20 MHz subchannel (corre...
Definition: he-phy.cc:1128
void RxPayloadFailed(Ptr< const WifiPsdu > psdu, double snr, const WifiTxVector &txVector) override
Perform amendment-specific actions when the payload is unsuccessfully received.
Definition: he-phy.cc:839
double GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const override
Return the CCA threshold in dBm for a given channel type.
Definition: he-phy.cc:1050
HePhy(bool buildModeList=true)
Constructor for HE PHY.
Definition: he-phy.cc:79
bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const override
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
Definition: he-phy.cc:715
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:551
static Time GetSymbolDuration(Time guardInterval)
Definition: he-phy.cc:1607
void SetTrigVector(const WifiTxVector &trigVector, Time validity)
Set the TRIGVECTOR and the associated expiration time.
Definition: he-phy.cc:323
static WifiMode GetHeMcs1()
Return MCS 1 from HE MCS values.
static std::pair< uint16_t, Time > ConvertHeTbPpduDurationToLSigLength(Time ppduDuration, const WifiTxVector &txVector, WifiPhyBand band)
Compute the L-SIG length value corresponding to the given HE TB PPDU duration.
Definition: he-phy.cc:255
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:1613
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:948
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
Definition: he-phy.cc:145
void SwitchMaybeToCcaBusy(const Ptr< const WifiPpdu > ppdu) override
Check if PHY state should move to CCA busy state based on current state of interference tracker.
Definition: he-phy.cc:1080
Time DoStartReceivePayload(Ptr< Event > event) override
Start receiving the PSDU (i.e.
Definition: he-phy.cc:749
void StartReceivePreamble(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW, Time rxDuration) override
Start receiving the PHY preamble of a PPDU (i.e.
Definition: he-phy.cc:346
virtual PhyFieldRxStatus ProcessSigA(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-A, perform amendment-specific actions, and provide an updated status of the reception.
Definition: he-phy.cc:586
void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu) override
Perform amendment-specific actions at the end of the reception of the payload.
Definition: he-phy.cc:850
static WifiMode GetHeMcs5()
Return MCS 5 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:427
static WifiMode GetHeMcs2()
Return MCS 2 from HE MCS values.
WifiMode GetSigAMode() const override
Definition: he-phy.cc:139
Time GetSigADuration(WifiPreamble preamble) const override
Definition: he-phy.cc:211
Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
Definition: he-phy.cc:190
std::vector< Time > m_lastPer20MHzDurations
Hold the last per-20 MHz CCA durations vector.
Definition: he-phy.h:581
void NotifyCcaBusy(const Ptr< const WifiPpdu > ppdu, Time duration, WifiChannelListType channelType) override
Notify PHY state helper to switch to CCA busy state,.
Definition: he-phy.cc:1109
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
Definition: he-phy.cc:1032
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
Definition: he-phy.cc:1523
RU Specification.
Definition: he-ru.h:66
static uint16_t GetUsableSubcarriers()
Definition: ofdm-phy.cc:616
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
Definition: phy-entity.h:524
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
PHY entity for VHT (11ac)
Definition: vht-phy.h:49
represent a single transmission mode
Definition: wifi-mode.h:50
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
WifiChannelListType
Enumeration of the possible channel-list parameter elements defined in Table 8-5 of IEEE 802....
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:78
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:50
uint8_t bssColor
BSS color.
Definition: he-phy.h:52
double rssiW
RSSI in W.
Definition: he-phy.h:51
Status of the reception of the PPDU field.
Definition: phy-entity.h:113
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:70
#define SU_STA_ID
Definition: wifi-mode.h:34