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);
71 :
OfdmPpdu (psdu, txVector, band, uid, false)
73 NS_LOG_FUNCTION (
this << psdu << txVector << ppduDuration << band << uid);
87 uint8_t sigExtension = 0;
105 uint16_t length = ((ceil ((static_cast<double> (ppduDuration.
GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
146 uint8_t sigExtension = 0;
151 uint8_t m =
IsDlMu () ? 1 : 2;
154 uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.
GetNanoSeconds ());
155 ppduDuration = preambleDuration + (nSymbols * tSymbol) +
MicroSeconds (sigExtension);
210 return m_psdus.begin ()->second;
217 auto it =
m_psdus.find (staId);
231 return m_psdus.begin ()->first;
284 std::ostringstream ss;
319 .SetGroupName (
"Wifi")
334 os <<
"MCS=" << +m_mcs
335 <<
" CHANNEL_WIDTH=" << GetChannelWidth ()
336 <<
" GI=" << GetGuardInterval ()
337 <<
" NSTS=" << +m_nsts
338 <<
" BSSColor=" << +m_bssColor
378 m_bssColor = bssColor;
390 if (channelWidth == 160)
394 else if (channelWidth == 80)
398 else if (channelWidth == 40)
411 if (m_bandwidth == 3)
415 else if (m_bandwidth == 2)
419 else if (m_bandwidth == 1)
432 if (gi == 800 && ltf == 1)
436 else if (gi == 800 && ltf == 2)
440 else if (gi == 1600 && ltf == 2)
453 if (m_gi_ltf_size == 3)
458 else if (m_gi_ltf_size == 2)
472 m_nsts = (nStreams - 1);
485 uint8_t byte = m_format & 0x01;
486 byte |= ((m_ul_dl & 0x01) << 2);
487 byte |= ((m_mcs & 0x0f) << 3);
488 start.WriteU8 (byte);
489 uint16_t bytes = (m_bssColor & 0x3f);
490 bytes |= (0x01 << 6);
491 bytes |= ((m_spatialReuse & 0x0f) << 7);
492 bytes |= ((m_bandwidth & 0x03) << 11);
493 bytes |= ((m_gi_ltf_size & 0x03) << 13);
494 bytes |= ((m_nsts & 0x01) << 15);
495 start.WriteU16 (bytes);
496 start.WriteU8 ((m_nsts >> 1) & 0x03);
500 sigA2 |= (0x01 << 14);
501 start.WriteU32 (sigA2);
516 uint8_t byte = i.
ReadU8 ();
517 m_format = (byte & 0x01);
518 m_ul_dl = ((byte >> 2) & 0x01);
519 m_mcs = ((byte >> 3) & 0x0f);
521 m_bssColor = (bytes & 0x3f);
522 m_spatialReuse = ((bytes >> 7) & 0x0f);
523 m_bandwidth = ((bytes >> 11) & 0x03);
524 m_gi_ltf_size = ((bytes >> 13) & 0x03);
525 m_nsts = ((bytes >> 15) & 0x01);
527 m_nsts |= (byte & 0x03) << 1;
Ptr< WifiPpdu > Copy(void) const override
Copy this instance.
Simulation virtual time values and global simulation resolution.
HeSigHeader m_heSig
the HE-SIG PHY header
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
Ptr< const WifiPsdu > GetPsdu(void) const
Get the payload of the PPDU.
void SetBssColor(uint8_t color)
Set the BSS color.
LSigHeader m_lSig
the L-SIG PHY header
WifiTxVector GetTxVector(void) const
Get the TXVECTOR used to send the PPDU.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
uint64_t m_uid
the unique ID of this PPDU
TxPsdFlag m_txPsdFlag
the transmit power spectral density flag
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
uint16_t GetGuardInterval(void) const
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.
WifiTxVector::HeMuUserInfoMap m_muUserInfos
the HE MU specific per-user information (to be removed once HE-SIG-B headers are implemented) ...
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.
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
void SetTxPsdFlag(TxPsdFlag flag)
WifiPhyBand m_band
the WifiPhyBand used to transmit that PPDU
void SetPhyHeaders(const WifiTxVector &txVector, Time ppduDuration)
Fill in the HE PHY headers.
iterator in a Buffer instance
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...
uint32_t GetDistanceFrom(Iterator const &o) const
WifiPreamble GetPreambleType(void) const
std::ostream & operator<<(std::ostream &os, const Angles &a)
static uint16_t GetBandwidth(RuType ruType)
Get the approximate bandwidth occupied by a RU.
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.
Time GetTxDuration(void) const override
Get the total transmission duration of the PPDU.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSD for HE TB PPDU non-OFDMA...
WifiPreamble m_preamble
the PHY preamble
WifiPpduType GetType(void) const override
Return the PPDU type (.
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
void SetNss(uint8_t nss)
Sets the number of Nss.
virtual ~HePpdu()
Destructor for HePpdu.
OFDM PPDU (11a)OfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header...
bool IsMu(void) const
Return true if the PPDU is a MU PPDU.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsUlMu(void) const
Return true if the PPDU is an UL MU PPDU.
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
void SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
RuType GetRuType(void) const
Get the RU type.
WifiPpduType
The type of PPDU (SU, DL MU, or UL MU)
non-HE TB PPDU transmissions
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
WifiPhyBand
Identifies the PHY band.
WifiConstPsduMap m_psdus
the PSDUs contained in this PPDU
WifiTxVector DoGetTxVector(void) const override
Get the TXVECTOR used to send the PPDU.
uint8_t GetBssColor(void) const
Get the BSS color.
Time Seconds(double value)
Construct a Time in the indicated unit.
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
HePpdu(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, Time ppduDuration, WifiPhyBand band, uint64_t uid)
Create an SU HE PPDU, storing a PSDU.
virtual uint16_t GetTransmissionChannelWidth(void) const
Get the channel width over which the PPDU will effectively be transmitted.
uint16_t GetTransmissionChannelWidth(void) const override
Get the channel width over which the PPDU will effectively be transmitted.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
OFDMA portion of HE TB PPDU, which should only be sent on RU.
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.
uint8_t GetMcsValue(void) const
a unique identifier for an interface.
TxPsdFlag GetTxPsdFlag(void) const
TypeId SetParent(TypeId tid)
Set the parent TypeId.
uint16_t GetStaId(void) const override
Get the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
std::string PrintPayload(void) const override
Print the payload of the PPDU.
uint16_t m_channelWidth
the channel width used to transmit that PPDU in MHz
bool IsDlMu(void) const
Return true if the PPDU is a DL MU PPDU.
preamble of HE TB PPDU, which should only be sent on minimum subset of 20 MHz channels containing RU ...
Declaration of ns3::HePpdu class.