23#include "ns3/wifi-phy.h"
24#include "ns3/wifi-psdu.h"
25#include "ns3/wifi-utils.h"
39 return (os <<
"PSD_NON_HE_TB");
41 return (os <<
"PSD_HE_TB_NON_OFDMA_PORTION");
43 return (os <<
"PSD_HE_TB_OFDMA_PORTION");
46 return (os <<
"INVALID");
52 :
OfdmPpdu (psdus.begin ()->
second, txVector, txCenterFreq, band, uid, false)
54 NS_LOG_FUNCTION (
this << psdus << txVector << txCenterFreq << ppduDuration << band << uid << flag);
65 heMuUserInfo.second.ru.SetPhyIndex (txVector.
GetChannelWidth (), p20Index);
67 NS_ABORT_MSG_IF (!ret,
"STA-ID " << heMuUserInfo.first <<
" already present");
76 :
OfdmPpdu (psdu, txVector, txCenterFreq, band, uid, false)
78 NS_LOG_FUNCTION (
this << psdu << txVector << txCenterFreq << ppduDuration << band << uid);
92 uint8_t sigExtension = 0;
97 uint8_t m =
IsDlMu () ? 1 : 2;
98 uint16_t length = ((ceil ((
static_cast<double> (ppduDuration.
GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
104 else if (!txVector.
IsUlMu ())
140 uint8_t sigExtension = 0;
145 uint8_t m =
IsDlMu () ? 1 : 2;
148 NS_ASSERT (calculatedDuration > preambleDuration);
149 uint32_t nSymbols = floor (
static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.
GetNanoSeconds ());
150 ppduDuration = preambleDuration + (nSymbols * tSymbol) +
MicroSeconds (sigExtension);
205 return m_psdus.begin ()->second;
212 auto it =
m_psdus.find (staId);
226 return m_psdus.begin ()->first;
278 std::ostringstream ss;
313 .SetGroupName (
"Wifi")
328 os <<
"MCS=" << +m_mcs
329 <<
" CHANNEL_WIDTH=" << GetChannelWidth ()
330 <<
" GI=" << GetGuardInterval ()
331 <<
" NSTS=" << +m_nsts
332 <<
" BSSColor=" << +m_bssColor
372 m_bssColor = bssColor;
384 if (channelWidth == 160)
388 else if (channelWidth == 80)
392 else if (channelWidth == 40)
405 if (m_bandwidth == 3)
409 else if (m_bandwidth == 2)
413 else if (m_bandwidth == 1)
426 if (gi == 800 && ltf == 1)
430 else if (gi == 800 && ltf == 2)
434 else if (gi == 1600 && ltf == 2)
447 if (m_gi_ltf_size == 3)
452 else if (m_gi_ltf_size == 2)
466 m_nsts = (nStreams - 1);
479 uint8_t
byte = m_format & 0x01;
480 byte |= ((m_ul_dl & 0x01) << 2);
481 byte |= ((m_mcs & 0x0f) << 3);
482 start.WriteU8 (
byte);
483 uint16_t bytes = (m_bssColor & 0x3f);
484 bytes |= (0x01 << 6);
485 bytes |= ((m_spatialReuse & 0x0f) << 7);
486 bytes |= ((m_bandwidth & 0x03) << 11);
487 bytes |= ((m_gi_ltf_size & 0x03) << 13);
488 bytes |= ((m_nsts & 0x01) << 15);
489 start.WriteU16 (bytes);
490 start.WriteU8 ((m_nsts >> 1) & 0x03);
494 sigA2 |= (0x01 << 14);
495 start.WriteU32 (sigA2);
510 uint8_t
byte = i.
ReadU8 ();
511 m_format = (
byte & 0x01);
512 m_ul_dl = ((
byte >> 2) & 0x01);
513 m_mcs = ((
byte >> 3) & 0x0f);
515 m_bssColor = (bytes & 0x3f);
516 m_spatialReuse = ((bytes >> 7) & 0x0f);
517 m_bandwidth = ((bytes >> 11) & 0x03);
518 m_gi_ltf_size = ((bytes >> 13) & 0x03);
519 m_nsts = ((bytes >> 15) & 0x01);
521 m_nsts |= (
byte & 0x03) << 1;
iterator in a Buffer instance
uint32_t GetDistanceFrom(Iterator const &o) const
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
HeSigHeader m_heSig
the HE-SIG PHY header
void SetTxPsdFlag(TxPsdFlag flag)
virtual bool IsDlMu(void) const
Return true if the PPDU is a DL MU PPDU.
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSD for HE TB PPDU non-OFDMA...
@ PSD_HE_TB_OFDMA_PORTION
OFDMA portion of HE TB PPDU, which should only be sent on RU.
@ PSD_NON_HE_TB
non-HE TB PPDU transmissions
@ PSD_HE_TB_NON_OFDMA_PORTION
preamble of HE TB PPDU, which should only be sent on minimum subset of 20 MHz channels containing RU
uint16_t GetTransmissionChannelWidth(void) const override
Get the channel width over which the PPDU will effectively be transmitted.
WifiTxVector::HeMuUserInfoMap m_muUserInfos
the HE MU specific per-user information (to be removed once HE-SIG-B headers are implemented)
virtual ~HePpdu()
Destructor for HePpdu.
virtual void SetPhyHeaders(const WifiTxVector &txVector, Time ppduDuration)
Fill in the HE PHY headers.
uint16_t GetStaId(void) const override
Get the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise.
WifiTxVector DoGetTxVector(void) const override
Get the TXVECTOR used to send the PPDU.
virtual bool IsUlMu(void) const
Return true if the PPDU is an UL MU PPDU.
Ptr< WifiPpdu > Copy(void) const override
Copy this instance.
Time GetTxDuration(void) const override
Get the total transmission duration of the PPDU.
virtual bool IsMu(void) const
Return true if the PPDU is a MU PPDU.
HePpdu(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, uint16_t txCenterFreq, Time ppduDuration, WifiPhyBand band, uint64_t uid)
Create an SU HE PPDU, storing a PSDU.
std::string PrintPayload(void) const override
Print the payload of the PPDU.
WifiPpduType GetType(void) const override
Return the PPDU type (.
TxPsdFlag m_txPsdFlag
the transmit power spectral density flag
TxPsdFlag GetTxPsdFlag(void) const
bool CanBeReceived(uint16_t p20MinFreq, uint16_t p20MaxFreq) const override
Check whether the given PPDU can be received on the specified primary channel.
static uint16_t GetBandwidth(RuType ruType)
Get the approximate bandwidth occupied by a RU.
WifiPhyBand m_band
the WifiPhyBand used to transmit that PPDU
LSigHeader m_lSig
the L-SIG PHY header
uint16_t m_channelWidth
the channel width used to transmit that PPDU in MHz
Simulation virtual time values and global simulation resolution.
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
uint8_t GetMcsValue(void) const
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
virtual bool CanBeReceived(uint16_t p20MinFreq, uint16_t p20MaxFreq) const
Check whether the given PPDU can be received on the specified primary channel.
WifiTxVector GetTxVector(void) const
Get the TXVECTOR used to send the PPDU.
WifiPreamble m_preamble
the PHY preamble
WifiConstPsduMap m_psdus
the PSDUs contained in this PPDU
Ptr< const WifiPsdu > GetPsdu(void) const
Get the payload of the PPDU.
virtual uint16_t GetTransmissionChannelWidth(void) const
Get the channel width over which the PPDU will effectively be transmitted.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
uint8_t GetBssColor(void) const
Get the BSS color.
bool IsDlMu(void) const
Return true if this TX vector is used for a downlink multi-user transmission.
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
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.
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
void SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
WifiPreamble GetPreambleType(void) const
HeRu::RuSpec GetRu(uint16_t staId) const
Get the RU specification for the STA-ID.
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.
void SetLength(uint16_t length)
Set the LENGTH field of the L-SIG.
const HeMuUserInfoMap & GetHeMuUserInfoMap(void) const
Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID.
bool IsMu(void) const
Return true if this TX vector is used for a multi-user transmission.
void SetBssColor(uint8_t color)
Set the BSS color.
uint16_t GetChannelWidth(void) const
uint16_t GetGuardInterval(void) const
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetNss(uint8_t nss)
Sets the number of Nss.
bool IsUlMu(void) const
Return true if this TX vector is used for an uplink multi-user transmission.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiPhyBand
Identifies the PHY band.
WifiPpduType
The type of PPDU (SU, DL MU, or UL MU)
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
Declaration of ns3::HePhy class and ns3::HeSigAParameters struct.
Declaration of ns3::HePpdu class.
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::ostream & operator<<(std::ostream &os, const Angles &a)
Ptr< T > Copy(Ptr< T > object)
Return a deep copy of a Ptr.