24 #include "ns3/wifi-psdu.h" 25 #include "ns3/wifi-phy.h" 27 #include "ns3/wifi-net-device.h" 28 #include "ns3/sta-wifi-mac.h" 29 #include "ns3/ap-wifi-mac.h" 30 #include "ns3/wifi-utils.h" 31 #include "ns3/simulator.h" 33 #include "ns3/assert.h" 140 uint8_t smallestMcs = 5;
143 smallestMcs =
std::min (smallestMcs, info.second.mcs.GetMcsValue ());
177 uint8_t nDataLtf, uint8_t nExtensionLtf )
const 181 NS_ABORT_MSG_IF (nDataLtf > 8,
"Unsupported number of LTFs " << +nDataLtf <<
" for HE");
182 NS_ABORT_MSG_IF (nExtensionLtf > 0,
"No extension LTFs expected for HE");
183 return stfDuration + ltfDuration * nDataLtf;
203 std::size_t commonFieldSize = 4 + 6 ;
206 commonFieldSize += 8;
210 commonFieldSize += 8 * (bw / 40) + 1 ;
223 std::size_t maxNumStaPerContentChannel =
std::max (numStaPerContentChannel.first, numStaPerContentChannel.second);
224 std::size_t maxNumUserBlockFields = maxNumStaPerContentChannel / 2;
225 std::size_t userSpecificFieldSize = maxNumUserBlockFields * (2 * 21 + 4 + 6 );
226 if (maxNumStaPerContentChannel % 2 != 0)
228 userSpecificFieldSize += 21 + 4 + 6 ;
238 double numSymbols = ceil ((commonFieldSize + userSpecificFieldSize) / numDataBitsPerSymbol);
252 uint8_t sigExtension = 0;
258 uint16_t length = ((ceil ((static_cast<double> (ppduDuration.
GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
268 uint8_t sigExtension = 0;
275 Time calculatedDuration =
MicroSeconds (((ceil (static_cast<double> (length + 3 + m) / 3)) * 4) + 20 + sigExtension);
276 uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
277 Time ppduDuration = preambleDuration + (nSymbols * tSymbol) +
MicroSeconds (sigExtension);
301 NS_ASSERT (gi == 800 || gi == 1600 || gi == 3200);
322 auto hePpdu = DynamicCast<HePpdu> (ppdu);
333 NS_LOG_INFO (
"Switch to OFDMA part (already started? " << (ofdmaStarted ?
"Y" :
"N") <<
") " <<
344 NS_LOG_INFO (
"Consider OFDMA part of the HE TB PPDU as interference since device dropped the preamble");
362 beginOfdmaPayloadRxEvent.second.Cancel ();
376 endMpduEvent.Cancel ();
396 beginOfdmaPayloadRxEvent.second.Cancel ();
410 auto uidPreamblePair = std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ());
414 auto it = currentPreambleEvents.find (uidPreamblePair);
415 if (it != currentPreambleEvents.end ())
417 NS_LOG_DEBUG (
"Received another HE TB PPDU for UID " << ppdu->GetUid () <<
" from STA-ID " << ppdu->GetStaId () <<
" and BSS color " << +txVector.GetBssColor ());
428 NS_LOG_DEBUG (
"Drop packet because not received within the 400ns window");
438 NS_LOG_DEBUG (
"Drop packet because already receiving another HE TB PPDU");
445 NS_LOG_DEBUG (
"Received a new HE TB PPDU for UID " << ppdu->GetUid () <<
" from STA-ID " << ppdu->GetStaId () <<
" and BSS color " << +txVector.GetBssColor ());
462 auto hePpdu = DynamicCast<const HePpdu> (ppdu);
472 uint8_t bssColor = 0;
479 bssColor = heConfiguration->GetBssColor ();
490 return ppdu->GetStaId ();
498 if (
mac &&
mac->IsAssociated ())
500 return mac->GetAssociationId ();
514 params.
bssColor =
event->GetTxVector ().GetBssColor ();
521 uint8_t rxBssColor =
event->GetTxVector ().GetBssColor ();
522 if (myBssColor != 0 && rxBssColor != 0 && myBssColor != rxBssColor)
524 NS_LOG_DEBUG (
"The BSS color of this PPDU (" << +rxBssColor <<
") does not match the device's (" << +myBssColor <<
"). The PPDU is filtered.");
537 NS_LOG_DEBUG (
"No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
568 NS_LOG_DEBUG (
"No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
586 if (info.first == staId)
588 nss = info.second.nss;
596 NS_LOG_DEBUG (
"Packet reception could not be started because not enough RX antennas");
601 NS_LOG_DEBUG (
"Drop packet because it was sent using an unsupported mode (" << txVector.
GetMode () <<
")");
616 bool isAp = device != 0 && (DynamicCast<ApWifiMac> (device->
GetMac ()) != 0);
619 NS_LOG_DEBUG (
"Ignore HE TB PPDU payload received by STA but keep state in Rx");
626 beginOfdmaPayloadRxEvent.second.Cancel ();
635 m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), staId), std::vector<bool> ()});
643 NS_ASSERT (beginOfdmaPayloadRxEvent.second.IsRunning ());
662 if (it->IsExpired ())
690 auto it = std::max_element (rxPowersW.begin (), rxPowersW.end (),
691 [] (
const std::pair<WifiSpectrumBand, double> &p1,
const std::pair<WifiSpectrumBand, double> &p2) {
692 return p1.second < p2.second;
710 m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetStaId ()), std::vector<bool> ()});
713 std::pair<uint16_t, WifiSpectrumBand>
716 if (txVector.
IsMu ())
734 NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
751 NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
766 NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
776 HeRu::SubcarrierRange range = std::make_pair (groupPreamble.front ().first, groupPreamble.back ().second);
843 auto hePpdu = DynamicCast<const HePpdu> (ppdu);
860 channelWidth = ruWidth < 20 ? 20 : ruWidth;
864 std::get<0> (txMaskRejectionParams), std::get<1> (txMaskRejectionParams), std::get<2> (txMaskRejectionParams));
879 if (nonOfdmaWidth != currentWidth)
885 uint16_t startingFrequency = centerFrequency - (currentWidth / 2);
886 centerFrequency = startingFrequency + nonOfdmaWidth * (nonOfdmaRu.
GetPhyIndex () - 1) + nonOfdmaWidth / 2;
888 return centerFrequency;
899 Transmit (nonOfdmaDuration, ppdu,
"non-OFDMA transmission");
902 auto hePpdu = DynamicCast<HePpdu> (ppdu->Copy ());
905 Time ofdmaDuration = ppdu->GetTxDuration () - nonOfdmaDuration;
923 for (
auto & staIdPsdu : psduMap)
928 NS_ABORT_MSG_IF (userInfoMap.find (staIdPsdu.first) == userInfoMap.end (),
"STA-ID in psduMap (" << staIdPsdu.first <<
") should be referenced in txVector");
932 if (current > maxDuration)
934 maxDuration = current;
944 for (uint8_t i = 0; i < 12; ++i)
955 return GetHeMcs ## x (); \ 972 NS_ABORT_MSG (
"Inexistent index (" << +index <<
") requested for HE");
978 #define GET_HE_MCS(x) \ 980 HePhy::GetHeMcs ## x (void) \ 982 static WifiMode mcs = CreateHeMcs (x); \ 1048 uint64_t dataRate =
GetDataRate (mcsValue, channelWidth, guardInterval, nss);
1056 if (txVector.
IsMu ())
1063 txVector.
GetNss (staId));
1070 if (txVector.
IsMu ())
1077 txVector.
GetNss (staId));
1083 NS_ASSERT (guardInterval == 800 || guardInterval == 1600 || guardInterval == 3200);
1094 switch (channelWidth)
1126 switch (constellationSize)
1131 dataRate = 54000000;
1135 NS_FATAL_ERROR (
"Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
std::map< uint16_t, EventId > m_beginOfdmaPayloadRxEvents
the beginning of the OFDMA payload reception events (indexed by STA-ID)
void NotifyRxDrop(Ptr< const WifiPsdu > psdu, WifiPhyRxfailureReason reason)
Public method used to fire a PhyRxDrop trace.
Ptr< const Event > GetCurrentEvent(void) const
Get the pointer to the current event (stored in WifiPhy).
const PpduFormats & GetPpduFormats(void) const override
Return the PPDU formats of the PHY.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
uint8_t GetNssMax(void) const
Simulation virtual time values and global simulation resolution.
std::map< UidStaIdPair, SignalNoiseDbm > m_signalNoiseMap
Map of the latest signal power and noise power in dBm (noise power includes the noise figure) ...
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...
std::vector< SubcarrierRange > SubcarrierGroup
a vector of subcarrier ranges defining a subcarrier group
Smart pointer class similar to boost::intrusive_ptr.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Parameters for received HE-SIG-A for OBSS_PD based SR.
static uint16_t ConvertHeTbPpduDurationToLSigLength(Time ppduDuration, WifiPhyBand band)
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received. ...
Ptr< HeConfiguration > GetHeConfiguration(void) const
static WifiMode GetVhtMcs5(void)
Return MCS 5 from VHT MCS values.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
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
static uint64_t CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate, uint8_t nss)
Calculates data rate from the supplied parameters.
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied VHT MCS index.
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).
void StartReceiveOfdmaPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
HePhy(bool buildModeList=true)
Constructor for HE PHY.
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
void ResetReceive(Ptr< Event > event)
Reset PHY at the end of the PPDU under reception after it has failed the PHY header.
static uint64_t CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate)
Return the PHY rate corresponding to the supplied code rate and data rate.
std::vector< EventId > m_endOfMpduEvents
the end of MPDU events (only used for A-MPDUs)
Time GetSymbolDuration(const WifiTxVector &txVector) const override
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
std::map< uint16_t, HeMuUserInfo > HeMuUserInfoMap
map of HE MU specific user info paramters indexed by STA-ID
PhyFieldRxStatus ProcessSigB(Ptr< Event > event, PhyFieldRxStatus status) override
Process SIG-B, perform amendment-specific actions, and provide an updated status of the reception...
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
virtual void DoAbortCurrentReception(WifiPhyRxfailureReason reason)
Perform amendment-specific actions before aborting the current reception.
void StartTx(Ptr< WifiPpdu > ppdu) override
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
virtual Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW)
Get the event corresponding to the incoming PPDU.
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const override
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu) override
Perform amendment-specific actions at the end of the reception of the payload.
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual void StartTx(Ptr< WifiPpdu > ppdu)
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
virtual uint16_t GetStaId(const Ptr< const WifiPpdu > ppdu) const
Return the STA ID that has been assigned to the station this PHY belongs to.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
bool IsStrictlyPositive(void) const
Exactly equivalent to t > 0.
Constructor class for HE modes.
bool IsMu(void) const
Return true if this TX vector is used for a multi-user transmission.
uint16_t GetGuardInterval(void) const
void DoResetReceive(Ptr< Event > event) override
Perform amendment-specific actions before resetting PHY at the end of the PPDU under reception after ...
#define HE_PHY
This defines the BSS membership value for HE PHY.
uint8_t GetNss(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the number of spatial streams.
uint8_t bssColor
BSS color.
virtual WifiSpectrumBand ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, HeRu::SubcarrierRange range, uint8_t bandIndex=0) const
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
const std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > & GetCurrentPreambleEvents(void) const
Get the map of current preamble events (stored in WifiPhy).
const uint16_t WIFI_CODE_RATE_3_4
3/4 coding rate
virtual ~HePhy()
Destructor for HE PHY.
std::pair< int16_t, int16_t > SubcarrierRange
(lowest index, highest index) pair defining a subcarrier range
void DoStartReceivePayload(Ptr< Event > event) override
Start receiving the PSDU (i.e.
static WifiMode GetVhtMcs4(void)
Return MCS 4 from VHT MCS values.
HeRu::RuSpec GetRu(uint16_t staId) const
Get the RU specification for the STA-ID.
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode...
uint16_t GetChannelWidth(void) const
WifiPreamble GetPreambleType(void) const
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP, HT-GF-STF + HT-GF-LTF1 fields for HT-GF, L-STF + L-LTF fields otherwise.
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
std::tuple< double, double, double > GetTxMaskRejectionParams(void) const
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
static WifiMode CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, WifiModulationClass modClass, CodeRateCallback codeRateCallback, ConstellationSizeCallback constellationSizeCallback, PhyRateCallback phyRateCallback, PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, DataRateCallback dataRateCallback, DataRateFromTxVectorCallback dataRateFromTxVectorCallback, NonHtReferenceRateCallback nonHtReferenceRateCallback, ModeAllowedCallback isModeAllowedCallback)
static class anonymous_namespace{he-phy.cc}::ConstructorHe g_constructor_he
the constructor for HE modes
static RuSpec FindOverlappingRu(uint16_t bw, RuSpec referenceRu, RuType searchedRuType)
Find the RU allocation of the given RU type overlapping the given reference RU allocation.
static bool IsModeAllowed(uint16_t channelWidth, uint8_t nss)
Check whether the combination of <MCS, channel width, NSS> is allowed.
uint64_t m_currentHeTbPpduUid
UID of the HE TB PPDU being received.
virtual Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
static uint16_t GetBandwidth(RuType ruType)
Get the approximate bandwidth occupied by a RU.
static const Ptr< const PhyEntity > GetStaticPhyEntity(WifiModulationClass modulation)
Get the implemented PHY entity corresponding to the modulation class.
static WifiMode GetVhtMcs1(void)
Return MCS 1 from VHT MCS values.
virtual std::pair< uint16_t, WifiSpectrumBand > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const
Get the channel width and band to use (will be overloaded by child classes).
Status of the reception of the PPDU field.
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
void SetPhyIndex(uint16_t bw, uint8_t p20Index)
Set the RU PHY index.
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...
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSD for HE TB PPDU non-OFDMA...
static RuType GetRuType(uint16_t bandwidth)
Get the RU corresponding to the approximate bandwidth.
WifiPpduField
The type of PPDU field (grouped for convenience)
void EndReceivePayload(Ptr< Event > event)
The last symbol of the PPDU has arrived.
uint64_t GetCurrentHeTbPpduUid(void) const
virtual void StartReceivePreamble(Ptr< WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration)
Start receiving the PHY preamble of a PPDU (i.e.
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
uint8_t m_maxMcsIndexPerSs
the maximum MCS index per spatial stream as defined by the standard
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...
std::pair< std::size_t, std::size_t > GetNumRusPerHeSigBContentChannel(void) const
Get the number of RUs per HE-SIG-B content channel.
static SubcarrierGroup GetSubcarrierGroup(uint16_t bw, RuType ruType, std::size_t phyIndex)
Get the subcarrier group of the RU having the given PHY index among all the RUs of the given type (nu...
static Ptr< SpectrumValue > CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40)
Create a transmit power spectral density corresponding to OFDM High Efficiency (HE) (802...
uint16_t GetCenterFrequencyForChannelWidth(const WifiTxVector &txVector) const
Get the center frequency of the channel corresponding the current TxVector rather than that of the su...
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
bool isSuccess
outcome (true if success) of the reception
void ScheduleEndOfMpdus(Ptr< Event > event)
Schedule end of MPDUs events.
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
Time GetSigADuration(WifiPreamble preamble) const override
void ErasePreambleEvent(Ptr< const WifiPpdu > ppdu, Time rxDuration)
Erase the event corresponding to the PPDU from the list of preamble events, but consider it as noise ...
const uint16_t WIFI_CODE_RATE_5_6
5/6 coding rate
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.
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...
Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector) const
std::vector< EventId > m_endRxPayloadEvents
the end of receive events (only one unless UL MU reception)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
void Transmit(Time txDuration, Ptr< WifiPpdu > ppdu, std::string type)
This function prepares most of the WifiSpectrumSignalParameters parameters and invokes SpectrumWifiPh...
void UpdateInterferenceEvent(Ptr< Event > event, RxPowerWattPerChannelBand rxPower)
Update an event in WifiPhy's InterferenceHelper class.
Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
static uint64_t m_globalPpduUid
Global counter of the PPDU UID.
virtual void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu)
Perform amendment-specific actions at the end of the reception of the payload.
static WifiMode GetVhtMcs0(void)
Return MCS 0 from VHT MCS values.
RuType GetRuType(void) const
Get the RU type.
void BuildModeList(void) override
Build mode list.
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied VHT MCS index.
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.
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...
void AddPreambleEvent(Ptr< Event > event)
Add an entry to the map of current preamble events (stored in WifiPhy).
static void AddStaticPhyEntity(WifiModulationClass modulation, Ptr< PhyEntity > phyEntity)
Add the PHY entity to the map of implemented PHY entities for the given modulation class...
virtual void DoStartReceivePayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
uint8_t m_maxSupportedMcsIndexPerSs
the maximum supported MCS index per spatial stream
static const PpduFormats m_hePpduFormats
HE PPDU formats.
static Time Now(void)
Return the current simulation virtual time.
static void InitializeModes(void)
Initialize all HE modes.
Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const override
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
Ptr< Event > CreateInterferenceEvent(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false)
Create an event using WifiPhy's InterferenceHelper class.
uint64_t GetPreviouslyRxPpduUid(void) const
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.
non-HE TB PPDU transmissions
drop PPDU and set CCA_BUSY
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...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
WifiMode GetSigAMode(void) const override
static double GetCodeRatio(WifiCodeRate codeRate)
Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
WifiPhyBand
Identifies the PHY band.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
static Ptr< SpectrumValue > CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, WifiSpectrumBand ru)
Create a transmit power spectral density corresponding to the OFDMA part of HE TB PPDUs for a given R...
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
uint16_t GetLength(void) const
Get the LENGTH field of the L-SIG.
Ptr< WifiMac > GetMac(void) const
std::map< UidStaIdPair, std::vector< bool > > m_statusPerMpduMap
Map of the current reception status per MPDU that is filled in as long as MPDUs are being processed b...
static WifiMode GetVhtMcs2(void)
Return MCS 2 from VHT MCS values.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
uint8_t GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const
If the operating channel width is a multiple of 20 MHz, return the index of the primary channel of th...
SignalNoiseDbm structure.
void CancelAllEvents(void) override
Cancel and clear all running events.
void NotifyInterferenceRxEndAndClear(bool reset)
Notify WifiPhy's InterferenceHelper of the end of the reception, clear maps and end of MPDU event...
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
bool IsUlMu(void) const
Return true if this TX vector is used for an uplink multi-user transmission.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW) override
Get the event corresponding to the incoming PPDU.
STF + LTF fields (excluding those in preamble for HT-GF)
PHY entity for VHT (11ac)VHT PHY is based on HT PHY.
Time GetSigBDuration(const WifiTxVector &txVector) const override
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...
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.
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.
Ptr< NetDevice > GetDevice(void) const
Return the device this PHY is associated with.
static WifiMode GetVhtMcs3(void)
Return MCS 3 from VHT MCS values.
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
uint8_t GetBssColor(void) const
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...
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
PhyFieldRxStatus ProcessSigA(Ptr< Event > event, PhyFieldRxStatus status) override
Process SIG-A, perform amendment-specific actions, and provide an updated status of the reception...
uint16_t GetChannelWidth(void) const
uint32_t GetMaxPsduSize(void) const override
Get the maximum PSDU size in bytes.
const WifiPhyOperatingChannel & GetOperatingChannel(void) const
Get a const reference to the operating channel.
uint8_t m_bssMembershipSelector
the BSS membership selector
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
Time FemtoSeconds(uint64_t value)
Construct a Time in the indicated unit.
virtual void CancelAllEvents(void)
Cancel and clear all running events.
int64_t GetFemtoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
PHY header field for DSSS or ERP, short PHY header field for HR/DSSS or ERP, field not present for HT...
bool IsNull(void) const
Check for null implementation.
OFDMA portion of HE TB PPDU, which should only be sent on RU.
void StartReceivePreamble(Ptr< WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration) override
Start receiving the PHY preamble of a PPDU (i.e.
const HeMuUserInfoMap & GetHeMuUserInfoMap(void) const
Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID...
Declaration of ns3::HePhy class and ns3::HeSigAParameters struct.
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
std::size_t GetIndex(void) const
Get the RU index.
uint16_t GetNonOfdmaWidth(HeRu::RuSpec ru) const
Get the width in MHz of the non-OFDMA portion of an HE TB PPDU.
Time GetLastRxEndTime(void) const
Return the end time of the last received packet.
uint8_t GetMcsValue(void) const
WifiSpectrumBand GetNonOfdmaBand(const WifiTxVector &txVector, uint16_t staId) const
Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
static uint16_t GetUsableSubcarriers(uint16_t channelWidth)
Time GetDuration(WifiPpduField field, const WifiTxVector &txVector) const override
Get the duration of the PPDU field (or group of fields) used by this entity for the given transmissio...
virtual bool IsModeSupported(WifiMode mode) const
Check if the WifiMode is supported.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
double GetRxPowerWForPpdu(Ptr< Event > event) const
Obtain the received power (W) for a given band.
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
preamble of HE TB PPDU, which should only be sent on minimum subset of 20 MHz channels containing RU ...
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
uint8_t GetMaxSupportedRxSpatialStreams(void) const
std::list< WifiMode > m_modeList
the list of supported modes
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
std::size_t GetPhyIndex(void) const
Get the RU PHY index.
virtual uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const
Return the channel width used to measure the RSSI.
Time GetLSigDuration(WifiPreamble preamble) const override
uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const
Declaration of ns3::HePpdu class.