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");
54 NS_LOG_FUNCTION (
this << psdus << txVector << ppduDuration << band << uid << flag);
65 heMuUserInfo.second.ru.SetPhyIndex (txVector.
GetChannelWidth (), p20Index);
67 NS_ABORT_MSG_IF (!ret,
"STA-ID " << heMuUserInfo.first <<
" already present");
77 :
OfdmPpdu (psdu, txVector, band, uid, false)
79 NS_LOG_FUNCTION (
this << psdu << txVector << ppduDuration << band << uid);
93 uint8_t sigExtension = 0;
111 uint16_t length = ((ceil ((
static_cast<double> (ppduDuration.
GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
153 uint8_t sigExtension = 0;
158 uint8_t m =
IsDlMu () ? 1 : 2;
161 uint32_t nSymbols = floor (
static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.
GetNanoSeconds ());
162 ppduDuration = preambleDuration + (nSymbols * tSymbol) +
MicroSeconds (sigExtension);
217 return m_psdus.begin ()->second;
224 auto it =
m_psdus.find (staId);
238 return m_psdus.begin ()->first;
291 std::ostringstream ss;
326 .SetGroupName (
"Wifi")
341 os <<
"MCS=" << +m_mcs
342 <<
" CHANNEL_WIDTH=" << GetChannelWidth ()
343 <<
" GI=" << GetGuardInterval ()
344 <<
" NSTS=" << +m_nsts
345 <<
" BSSColor=" << +m_bssColor
385 m_bssColor = bssColor;
397 if (channelWidth == 160)
401 else if (channelWidth == 80)
405 else if (channelWidth == 40)
418 if (m_bandwidth == 3)
422 else if (m_bandwidth == 2)
426 else if (m_bandwidth == 1)
439 if (gi == 800 && ltf == 1)
443 else if (gi == 800 && ltf == 2)
447 else if (gi == 1600 && ltf == 2)
460 if (m_gi_ltf_size == 3)
465 else if (m_gi_ltf_size == 2)
479 m_nsts = (nStreams - 1);
492 uint8_t
byte = m_format & 0x01;
493 byte |= ((m_ul_dl & 0x01) << 2);
494 byte |= ((m_mcs & 0x0f) << 3);
495 start.WriteU8 (
byte);
496 uint16_t bytes = (m_bssColor & 0x3f);
497 bytes |= (0x01 << 6);
498 bytes |= ((m_spatialReuse & 0x0f) << 7);
499 bytes |= ((m_bandwidth & 0x03) << 11);
500 bytes |= ((m_gi_ltf_size & 0x03) << 13);
501 bytes |= ((m_nsts & 0x01) << 15);
502 start.WriteU16 (bytes);
503 start.WriteU8 ((m_nsts >> 1) & 0x03);
507 sigA2 |= (0x01 << 14);
508 start.WriteU32 (sigA2);
523 uint8_t
byte = i.
ReadU8 ();
524 m_format = (
byte & 0x01);
525 m_ul_dl = ((
byte >> 2) & 0x01);
526 m_mcs = ((
byte >> 3) & 0x0f);
528 m_bssColor = (bytes & 0x3f);
529 m_spatialReuse = ((bytes >> 7) & 0x0f);
530 m_bandwidth = ((bytes >> 11) & 0x03);
531 m_gi_ltf_size = ((bytes >> 13) & 0x03);
532 m_nsts = ((bytes >> 15) & 0x01);
534 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
bool CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const override
Check whether the given PPDU can be received on the specified primary channel.
void SetTxPsdFlag(TxPsdFlag flag)
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.
HePpdu(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, Time ppduDuration, WifiPhyBand band, uint64_t uid)
Create an SU HE PPDU, storing a PSDU.
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.
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.
bool IsMu(void) const
Return true if the PPDU is a MU PPDU.
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
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)
WifiTxVector GetTxVector(void) const
Get the TXVECTOR used to send the PPDU.
WifiPreamble m_preamble
the PHY preamble
virtual bool CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const
Check whether the given PPDU can be received on the specified primary channel.
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.
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.
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.
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_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#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.