27#include "ns3/ap-wifi-mac.h" 
   28#include "ns3/assert.h" 
   29#include "ns3/interference-helper.h" 
   31#include "ns3/simulator.h" 
   32#include "ns3/sta-wifi-mac.h" 
   33#include "ns3/vht-configuration.h" 
   34#include "ns3/wifi-net-device.h" 
   35#include "ns3/wifi-phy.h" 
   36#include "ns3/wifi-psdu.h" 
   37#include "ns3/wifi-utils.h" 
   80      m_trigVector(
std::nullopt),
 
   81      m_trigVectorExpirationTime(
std::nullopt),
 
   82      m_currentTxVector(
std::nullopt),
 
   84      m_lastPer20MHzDurations()
 
  155    uint8_t smallestMcs = 5; 
 
  158        smallestMcs = std::min(smallestMcs, info.second.mcs);
 
  193                           uint8_t nExtensionLtf )
 const 
  206    NS_ABORT_MSG_IF(nDataLtf > 8, 
"Unsupported number of LTFs " << +nDataLtf << 
" for HE");
 
  207    NS_ABORT_MSG_IF(nExtensionLtf > 0, 
"No extension LTFs expected for HE");
 
  208    return stfDuration + ltfDuration * nDataLtf; 
 
  236    if (
auto sigBSize = 
GetSigBSize(txVector); sigBSize > 0)
 
  242        auto numSymbols = ceil((sigBSize) / ndbps);
 
  244        return FemtoSeconds(
static_cast<uint64_t
>(numSymbols * symbolDuration.GetFemtoSeconds()));
 
  260        floor(
static_cast<double>((ppduDuration - preambleDuration).GetNanoSeconds() -
 
  261                                  (sigExtension * 1000)) /
 
  263    return preambleDuration + (nSymbols * tSymbol) + 
MicroSeconds(sigExtension);
 
  266std::pair<uint16_t, Time>
 
  276    uint16_t length = ((ceil((
static_cast<double>(ppduDuration.
GetNanoSeconds() - (20 * 1000) -
 
  277                                                  (sigExtension * 1000)) /
 
  282    return {length, ppduDuration};
 
  294    Time calculatedDuration =
 
  295        MicroSeconds(((ceil(
static_cast<double>(length + 3 + m) / 3)) * 4) + 20 + sigExtension);
 
  328    NS_ASSERT(gi == 800 || gi == 1600 || gi == 3200);
 
  351    return Create<HePpdu>(psdus,
 
  365    const auto& txVector = ppdu->GetTxVector();
 
  366    auto hePpdu = DynamicCast<const HePpdu>(ppdu);
 
  368    const auto psdFlag = hePpdu->GetTxPsdFlag();
 
  377            NS_LOG_INFO(
"Switch to OFDMA part (already started? " 
  378                        << (ofdmaStarted ? 
"Y" : 
"N") << 
") " 
  379                        << 
"and schedule OFDMA payload reception in " 
  393            NS_LOG_INFO(
"Consider OFDMA part of the PPDU as interference since device dropped the " 
  405            ppdu->GetTxDuration()); 
 
  415        beginOfdmaPayloadRxEvent.second.Cancel();
 
  429            endMpduEvent.Cancel();
 
  449        beginOfdmaPayloadRxEvent.second.Cancel();
 
  462    const auto uidPreamblePair = std::make_pair(ppdu->GetUid(), ppdu->GetPreamble());
 
  464    const auto it = currentPreambleEvents.find(uidPreamblePair);
 
  468        const auto& txVector = ppdu->GetTxVector();
 
  469        const auto rxDuration =
 
  473                : ppdu->GetTxDuration();
 
  474        if (it != currentPreambleEvents.cend())
 
  479                             << ppdu->GetUid() << 
" from STA-ID " << ppdu->GetStaId()
 
  480                             << 
" and BSS color " << +txVector.GetBssColor());
 
  484                NS_LOG_DEBUG(
"Received another response to a trigger frame " << ppdu->GetUid());
 
  505                NS_LOG_DEBUG(
"Drop packet because already receiving another HE TB PPDU");
 
  512                    "Drop packet because already receiving another response to a trigger frame");
 
  522                             << ppdu->GetUid() << 
" from STA-ID " << ppdu->GetStaId()
 
  523                             << 
" and BSS color " << +txVector.GetBssColor());
 
  527                NS_LOG_DEBUG(
"Received response to a trigger frame for UID " << ppdu->GetUid());
 
  535        const auto& txVector = ppdu->GetTxVector();
 
  553        auto hePpdu = DynamicCast<const HePpdu>(ppdu);
 
  563    uint8_t bssColor = 0;
 
  569            bssColor = heConfiguration->GetBssColor();
 
  580        return ppdu->GetStaId();
 
  585        if (mac && mac->IsAssociated())
 
  587            return mac->GetAssociationId();
 
  627        if (myBssColor != 0 && rxBssColor != 0 && myBssColor != rxBssColor)
 
  630                         << +rxBssColor << 
") does not match the device's (" << +myBssColor
 
  631                         << 
"). The PPDU is filtered.");
 
  653                NS_LOG_DEBUG(
"No valid TRIGVECTOR, the PHY was not expecting a TB PPDU");
 
  664                NS_LOG_DEBUG(
"Received channel width different than in TRIGVECTOR");
 
  670                                                    << 
") different than in TRIGVECTOR (" 
  674            uint16_t staId = ppdu->GetStaId();
 
  678                NS_LOG_DEBUG(
"TB PPDU received from un unexpected STA ID");
 
  697                "No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
 
  737                "No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
 
  741    if (event->GetTxVector().IsDlMu())
 
  751            event->GetPpdu()->GetUid(); 
 
  773            if (info.first == staId)
 
  775                nss = info.second.nss; 
 
  783        NS_LOG_DEBUG(
"Packet reception could not be started because not enough RX antennas");
 
  788        NS_LOG_DEBUG(
"Drop packet because it was sent using an unsupported mode (" 
  799    const auto& txVector = 
event->GetTxVector();
 
  801    if (!txVector.IsMu())
 
  809    if (txVector.IsDlMu())
 
  811        Time payloadDuration =
 
  814        return payloadDuration;
 
  830    Time timeToEndRx = payloadDuration + maxOffset;
 
  834        NS_LOG_DEBUG(
"Ignore HE TB PPDU payload received by STA but keep state in Rx");
 
  843            beginOfdmaPayloadRxEvent.second.Cancel();
 
  852        m_statusPerMpduMap.insert({std::make_pair(ppdu->GetUid(), staId), std::vector<bool>()});
 
  858            NS_ASSERT(beginOfdmaPayloadRxEvent.second.IsRunning());
 
  870                          const std::vector<bool>& statusPerMpdu)
 
  873    m_state->NotifyRxPsduSucceeded(psdu, rxSignalInfo, txVector, staId, statusPerMpdu);
 
  888    m_state->NotifyRxPsduFailed(psdu, snr);
 
  891        m_state->SwitchFromRxEndError();
 
  924                m_state->SwitchFromRxEndError();
 
  945    auto it = rxPowersW.end();
 
  948        it = std::max_element(rxPowersW.cbegin(),
 
  950                              [](
const auto& p1, 
const auto& p2) { return p1.second < p2.second; });
 
  965    Time payloadDuration =
 
  973    m_statusPerMpduMap.insert({std::make_pair(ppdu->GetUid(), staId), std::vector<bool>()});
 
  978std::pair<uint16_t, WifiSpectrumBandInfo>
 
  998    NS_ASSERT(channelWidth <= m_wifiPhy->GetChannelWidth());
 
 1004        std::make_pair(group.front().first, group.back().second);
 
 1013    return {indices, frequencies};
 
 1022    NS_ASSERT(channelWidth <= m_wifiPhy->GetChannelWidth());
 
 1028        std::make_pair(group.front().first, group.back().second);
 
 1038    return {indices, frequencies};
 
 1046    NS_ASSERT(channelWidth <= m_wifiPhy->GetChannelWidth());
 
 1061        std::make_pair(groupPreamble.front().first, groupPreamble.back().second);
 
 1069    return {indices, frequencies};
 
 1105    return channelWidth;
 
 1126    const uint16_t ppduBw = ppdu->GetTxVector().GetChannelWidth();
 
 1128    uint16_t bw = ppduBw;
 
 1144    if (ccaIndication.has_value())
 
 1146        NS_LOG_DEBUG(
"CCA busy for " << ccaIndication.value().second << 
" during " 
 1147                                     << ccaIndication.value().first.As(
Time::S));
 
 1148        NotifyCcaBusy(ccaIndication.value().first, ccaIndication.value().second, per20MHzDurations);
 
 1179                     const std::vector<Time>& per20MHzDurations)
 
 1182    m_state->SwitchMaybeToCcaBusy(duration, channelType, per20MHzDurations);
 
 1202    std::vector<Time> per20MhzDurations{};
 
 1205    for (
auto index : indices)
 
 1214        double ccaThresholdDbm = -62;
 
 1219            const uint16_t subchannelMinFreq =
 
 1221            const uint16_t subchannelMaxFreq = subchannelMinFreq + 20;
 
 1222            const uint16_t ppduBw = ppdu->GetTxVector().GetChannelWidth();
 
 1224            if (ppduBw <= m_wifiPhy->GetChannelWidth() &&
 
 1225                ppdu->DoesOverlapChannel(subchannelMinFreq, subchannelMaxFreq))
 
 1227                std::optional<double> obssPdLevel{std::nullopt};
 
 1243                        obssPdLevel.has_value() ? std::max(-72.0, obssPdLevel.value()) : -72.0;
 
 1254                        obssPdLevel.has_value() ? std::max(-72.0, obssPdLevel.value() + 3) : -72.0;
 
 1265                        obssPdLevel.has_value() ? std::max(-69.0, obssPdLevel.value() + 6) : -69.0;
 
 1276            delayUntilCcaEnd = std::max(delayUntilCcaEnd, ppduCcaDuration);
 
 1278        per20MhzDurations.push_back(delayUntilCcaEnd);
 
 1281    return per20MhzDurations;
 
 1316    if (heConfiguration->GetMaxTbPpduDelay().IsStrictlyPositive())
 
 1318        maxDelay = 
Min(maxDelay, heConfiguration->GetMaxTbPpduDelay());
 
 1326    auto hePpdu = DynamicCast<const HePpdu>(ppdu);
 
 1337    const auto& txVector = ppdu->GetTxVector();
 
 1339    uint16_t channelWidth = txVector.GetChannelWidth();
 
 1340    NS_LOG_FUNCTION(
this << centerFrequency << channelWidth << txPowerW << txVector);
 
 1341    const auto& puncturedSubchannels = txVector.GetInactiveSubchannels();
 
 1342    if (!puncturedSubchannels.empty())
 
 1345        const auto& indices =
 
 1347        const auto p20IndexInBitmap = p20Index - *(indices.cbegin());
 
 1349            !puncturedSubchannels.at(p20IndexInBitmap)); 
 
 1352    switch (ppdu->GetType())
 
 1358            const uint16_t staId = 
GetStaId(ppdu);
 
 1361            channelWidth = (ruWidth < 20) ? 20 : ruWidth;
 
 1367                std::get<0>(txMaskRejectionParams),
 
 1368                std::get<1>(txMaskRejectionParams),
 
 1369                std::get<2>(txMaskRejectionParams),
 
 1370                puncturedSubchannels);
 
 1391                std::get<0>(txMaskRejectionParams),
 
 1392                std::get<1>(txMaskRejectionParams),
 
 1393                std::get<2>(txMaskRejectionParams),
 
 1394                puncturedSubchannels);
 
 1403                std::get<0>(txMaskRejectionParams),
 
 1404                std::get<1>(txMaskRejectionParams),
 
 1405                std::get<2>(txMaskRejectionParams),
 
 1406                puncturedSubchannels);
 
 1411        NS_ASSERT(puncturedSubchannels.empty());
 
 1417            std::get<0>(txMaskRejectionParams),
 
 1418            std::get<1>(txMaskRejectionParams),
 
 1419            std::get<2>(txMaskRejectionParams));
 
 1434    if (nonOfdmaWidth != currentWidth)
 
 1440        uint16_t startingFrequency = centerFrequency - (currentWidth / 2);
 
 1449    return centerFrequency;
 
 1456    const auto& txVector = ppdu->GetTxVector();
 
 1463        auto nonOfdmaTxPowerDbm =
 
 1468        auto hePpdu = DynamicCast<const HePpdu>(ppdu);
 
 1478        auto nonOfdmaTxPowerSpectrum =
 
 1483                 nonOfdmaTxPowerSpectrum,
 
 1484                 "non-OFDMA transmission");
 
 1487        auto ofdmaDuration = ppdu->GetTxDuration() - nonOfdmaDuration;
 
 1488        auto ofdmaTxPowerSpectrum =
 
 1495                            ofdmaTxPowerSpectrum,
 
 1511    auto hePpdu = DynamicCast<const HePpdu>(ppdu);
 
 1514    Transmit(ofdmaDuration, ppdu, txPowerDbm, txPowerSpectrum, 
"OFDMA transmission");
 
 1529    for (
auto& staIdPsdu : psduMap)
 
 1535            NS_ABORT_MSG_IF(userInfoMap.find(staIdPsdu.first) == userInfoMap.end(),
 
 1536                            "STA-ID in psduMap (" << staIdPsdu.first
 
 1537                                                  << 
") should be referenced in txVector");
 
 1543        if (current > maxDuration)
 
 1545            maxDuration = current;
 
 1555    for (uint8_t i = 0; i < 12; ++i)
 
 1566        return GetHeMcs##x(); 
 1583        NS_ABORT_MSG(
"Inexistent index (" << +index << 
") requested for HE");
 
 1589#define GET_HE_MCS(x)                                                                              \ 
 1590    WifiMode HePhy::GetHeMcs##x()                                                                  \ 
 1592        static WifiMode mcs = CreateHeMcs(x);                                                      \ 
 1657    uint64_t dataRate = 
GetDataRate(mcsValue, channelWidth, guardInterval, nss);
 
 1665    if (txVector.
IsMu())
 
 1679    if (txVector.
IsMu())
 
 1692    NS_ASSERT(guardInterval == 800 || guardInterval == 1600 || guardInterval == 3200);
 
 1704    switch (channelWidth)
 
 1742    switch (constellationSize)
 
 1747            dataRate = 54000000;
 
 1751            NS_FATAL_ERROR(
"Trying to get reference rate for a MCS with wrong combination of " 
 1752                           "coding rate and modulation");
 
 1799    if (ppdu->GetTxVector().IsUlMu() && mac && mac->GetTypeOfStation() == 
AP)
 
 1818            rxPpdu = ppdu->Copy();
 
 1824        auto hePpdu = DynamicCast<const HePpdu>(rxPpdu);
 
 1829    else if (
auto txVector = ppdu->GetTxVector();
 
 1835        if (txVector.GetChannelWidth() != triggerChannelWidth)
 
 1837            txVector.SetChannelWidth(triggerChannelWidth);
 
 1838            ppdu->UpdateTxVector(txVector);
 
 1846                              uint16_t guardBandwidth,
 
 1853        static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / subcarrierSpacing) + 0.5);
 
 1858        centerFrequencyIndex = (nGuardBands / 2) + 6 + 122;
 
 1861        centerFrequencyIndex = (nGuardBands / 2) + 12 + 244;
 
 1864        centerFrequencyIndex = (nGuardBands / 2) + 12 + 500;
 
 1867        centerFrequencyIndex = (nGuardBands / 2) + 12 + 1012;
 
 1874    size_t numBandsInBand = 
static_cast<size_t>(bandWidth * 1e6 / subcarrierSpacing);
 
 1875    centerFrequencyIndex += numBandsInBand * bandIndex;
 
 1877    convertedSubcarriers.first = centerFrequencyIndex + subcarrierRange.first;
 
 1878    convertedSubcarriers.second = centerFrequencyIndex + subcarrierRange.second;
 
 1879    return convertedSubcarriers;
 
 1886    for (uint16_t bw = 160; bw >= 20; bw = bw / 2)
 
 1888        for (
uint32_t i = 0; i < (channelWidth / bw); ++i)
 
 1890            for (
uint32_t type = 0; type < 7; type++)
 
 1894                for (std::size_t phyIndex = 1; phyIndex <= nRus; phyIndex++)
 
 1898                        std::make_pair(group.front().first, group.back().second);
 
 1901                                                                    phy->GetSubcarrierSpacing(),
 
 1904                    const auto bandFrequencies = phy->ConvertIndicesToFrequencies(bandIndices);
 
 1907                        (bw == 160 && phyIndex > nRus / 2 ? phyIndex - nRus / 2 : phyIndex);
 
 1908                    const auto p20Index = phy->GetOperatingChannel().GetPrimaryChannelIndex(20);
 
 1909                    bool primary80IsLower80 = (p20Index < bw / 40);
 
 1911                                      (primary80IsLower80 && phyIndex <= nRus / 2) ||
 
 1912                                      (!primary80IsLower80 && phyIndex > nRus / 2));
 
 1915                    ruBands.insert({band, ru});
 
Constructor class for HE modes.
 
bool IsNull() const
Check for null implementation.
 
std::optional< WifiTxVector > m_trigVector
the TRIGVECTOR
 
Time GetLSigDuration(WifiPreamble preamble) const override
 
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
 
void StartReceiveOfdmaPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
 
uint64_t GetCurrentHeTbPpduUid() const
 
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW) override
Get the event corresponding to the incoming PPDU.
 
void CancelAllEvents() override
Cancel and clear all running events.
 
void SetObssPdAlgorithm(const Ptr< ObssPdAlgorithm > algorithm)
Sets the OBSS-PD algorithm.
 
static void InitializeModes()
Initialize all HE modes.
 
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
 
WifiSpectrumBandInfo 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...
 
Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
 
void StartTxOfdma(Ptr< const WifiPpdu > ppdu, double txPowerDbm, Ptr< SpectrumValue > txPowerSpectrum, Time ofdmaDuration)
Start the transmission of the OFDMA part of the MU PPDU.
 
virtual PhyFieldRxStatus ProcessSigB(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-B, perform amendment-specific actions, and provide an updated status of the reception.
 
std::optional< WifiTxVector > m_currentTxVector
If the STA is an AP STA, this holds the TXVECTOR of the PPDU that has been sent.
 
Time GetSigBDuration(const WifiTxVector &txVector) const override
 
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
 
virtual uint32_t GetSigBSize(const WifiTxVector &txVector) const
 
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
 
void BuildModeList() override
Build mode list.
 
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.
 
uint16_t GetNonOfdmaWidth(HeRu::RuSpec ru) const
Get the width in MHz of the non-OFDMA portion of an HE TB PPDU.
 
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...
 
std::map< uint16_t, EventId > m_beginOfdmaPayloadRxEvents
the beginning of the OFDMA payload reception events (indexed by STA-ID)
 
void SetEndOfHeSigACallback(EndOfHeSigACallback callback)
Set a callback for a end of HE-SIG-A.
 
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
 
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
 
void StartTx(Ptr< const WifiPpdu > ppdu) override
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
 
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...
 
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
 
Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const override
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
 
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
 
const PpduFormats & GetPpduFormats() const override
Return the PPDU formats of the PHY.
 
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
 
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< ObssPdAlgorithm > m_obssPdAlgorithm
OBSS-PD algorithm.
 
bool CanStartRx(Ptr< const WifiPpdu > ppdu, uint16_t txChannelWidth) const override
Determine whether the PHY shall issue a PHY-RXSTART.indication primitive in response to a given PPDU.
 
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.
 
virtual Time CalculateNonOfdmaDurationForHeTb(const WifiTxVector &txVector) const
 
uint8_t GetBssColor() const
 
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,...
 
static WifiSpectrumBandIndices ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, uint32_t subcarrierSpacing, HeRu::SubcarrierRange subcarrierRange, uint8_t bandIndex=0)
 
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
 
Time GetMaxDelayPpduSameUid(const WifiTxVector &txVector) override
Obtain the maximum time between two PPDUs with the same UID to consider they are identical and their ...
 
static bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
 
std::size_t m_rxHeTbPpdus
Number of successfully received HE TB PPDUS.
 
std::map< WifiSpectrumBandInfo, HeRu::RuSpec > RuBands
Map a spectrum band associated with an RU to the RU specification.
 
~HePhy() override
Destructor for HE PHY.
 
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
 
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
 
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,...
 
virtual Time CalculateNonOfdmaDurationForHeMu(const WifiTxVector &txVector) const
 
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.
 
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,...
 
uint64_t m_currentMuPpduUid
UID of the HE MU or HE TB PPDU being received.
 
uint32_t GetMaxPsduSize() const override
Get the maximum PSDU size in bytes.
 
static const PpduFormats m_hePpduFormats
HE PPDU formats.
 
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.
 
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...
 
void RxPayloadFailed(Ptr< const WifiPsdu > psdu, double snr, const WifiTxVector &txVector) override
Perform amendment-specific actions when the payload is unsuccessfuly received.
 
double GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const override
Return the CCA threshold in dBm for a given channel type.
 
Ptr< const WifiPpdu > GetRxPpduFromTxPpdu(Ptr< const WifiPpdu > ppdu) override
The WifiPpdu from the TX PHY is received by each RX PHY attached to the same channel.
 
HePhy(bool buildModeList=true)
Constructor for HE PHY.
 
bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const override
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
 
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 Time GetSymbolDuration(Time guardInterval)
 
std::pair< uint16_t, WifiSpectrumBandInfo > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const override
Get the channel width and band to use (will be overloaded by child classes).
 
void SetTrigVector(const WifiTxVector &trigVector, Time validity)
Set the TRIGVECTOR and the associated expiration time.
 
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.
 
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.
 
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
 
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.
 
Time DoStartReceivePayload(Ptr< Event > event) override
Start receiving the PSDU (i.e.
 
void StartReceivePreamble(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW, Time rxDuration) override
Start receiving the PHY preamble of a PPDU (i.e.
 
virtual PhyFieldRxStatus ProcessSigA(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-A, perform amendment-specific actions, and provide an updated status of the reception.
 
std::optional< Time > m_trigVectorExpirationTime
expiration time of the TRIGVECTOR
 
void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu) override
Perform amendment-specific actions at the end of the reception of the payload.
 
void DoResetReceive(Ptr< Event > event) override
Perform amendment-specific actions before resetting PHY at the end of the PPDU under reception after ...
 
WifiMode GetSigAMode() const override
 
Time GetSigADuration(WifiPreamble preamble) const override
 
WifiSpectrumBandInfo GetNonOfdmaBand(const WifiTxVector &txVector, uint16_t staId) const
Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
 
Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
 
std::vector< Time > m_lastPer20MHzDurations
Hold the last per-20 MHz CCA durations vector.
 
void NotifyCcaBusy(const Ptr< const WifiPpdu > ppdu, Time duration, WifiChannelListType channelType) override
Notify PHY state helper to switch to CCA busy state,.
 
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
 
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
 
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
 
WifiSpectrumBandInfo 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...
 
static RuBands GetRuBands(Ptr< const WifiPhy > phy, uint16_t channelWidth, uint16_t guardBandwidth)
Static function to compute the RU bands that belong to a given channel width.
 
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSDs for pre-HE and HE porti...
 
@ PSD_HE_PORTION
HE portion of an HE PPDU.
 
@ PSD_NON_HE_PORTION
Non-HE portion of an HE PPDU.
 
static uint32_t GetSigBFieldSize(uint16_t channelWidth, const RuAllocation &ruAllocation)
Get variable length HE SIG-B field size.
 
std::size_t GetIndex() const
Get the RU index.
 
RuType GetRuType() const
Get the RU type.
 
std::size_t GetPhyIndex(uint16_t bw, uint8_t p20Index) const
Get the RU PHY index.
 
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 uint16_t GetBandwidth(RuType ruType)
Get the approximate bandwidth occupied by a RU.
 
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 std::size_t GetNRus(uint16_t bw, RuType ruType)
Get the number of distinct RUs of the given type (number of tones) available in a HE PPDU of the give...
 
std::vector< SubcarrierRange > SubcarrierGroup
a vector of subcarrier ranges defining a subcarrier group
 
std::pair< int16_t, int16_t > SubcarrierRange
(lowest index, highest index) pair defining a subcarrier range
 
RuType
The different HE Resource Unit (RU) types.
 
static RuType GetRuType(uint16_t bandwidth)
Get the RU corresponding to the approximate bandwidth.
 
static uint64_t CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate)
Return the PHY rate corresponding to the supplied code rate and data rate.
 
uint8_t m_bssMembershipSelector
the BSS membership selector
 
uint8_t m_maxMcsIndexPerSs
the maximum MCS index per spatial stream as defined by the standard
 
static uint64_t CalculateDataRate(Time symbolDuration, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate, uint8_t nss)
Calculates data rate from the supplied parameters.
 
static double GetCodeRatio(WifiCodeRate codeRate)
Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
 
uint8_t m_maxSupportedMcsIndexPerSs
the maximum supported MCS index per spatial stream
 
double GetObssPdLevel() const
 
static uint16_t GetUsableSubcarriers()
 
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
 
void NotifyPayloadBegin(const WifiTxVector &txVector, const Time &payloadDuration)
Fire the trace indicating that the PHY is starting to receive the payload of a PPDU.
 
Ptr< WifiPhyStateHelper > m_state
Pointer to WifiPhyStateHelper of the WifiPhy (to make it reachable for child classes)
 
std::tuple< double, double, double > GetTxMaskRejectionParams() const
 
virtual Time DoStartReceivePayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
 
Time GetDelayUntilCcaEnd(double thresholdDbm, const WifiSpectrumBandInfo &band)
Return the delay until CCA busy is ended for a given sensitivity threshold (in dBm) and a given band.
 
virtual bool CanStartRx(Ptr< const WifiPpdu > ppdu, uint16_t txChannelWidth) const
Determine whether the PHY shall issue a PHY-RXSTART.indication primitive in response to a given PPDU.
 
virtual void StartReceivePreamble(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW, Time rxDuration)
Start receiving the PHY preamble of a PPDU (i.e.
 
const std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > & GetCurrentPreambleEvents() const
Get the map of current preamble events (stored in WifiPhy).
 
std::map< UidStaIdPair, SignalNoiseDbm > m_signalNoiseMap
Map of the latest signal power and noise power in dBm (noise power includes the noise figure)
 
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
 
void Transmit(Time txDuration, Ptr< const WifiPpdu > ppdu, double txPowerDbm, Ptr< SpectrumValue > txPowerSpectrum, const std::string &type)
This function prepares most of the WifiSpectrumSignalParameters parameters and invokes SpectrumWifiPh...
 
std::vector< EventId > m_endOfMpduEvents
the end of MPDU events (only used for A-MPDUs)
 
virtual void CancelAllEvents()
Cancel and clear all running events.
 
virtual void DoAbortCurrentReception(WifiPhyRxfailureReason reason)
Perform amendment-specific actions before aborting the current reception.
 
void EndReceivePayload(Ptr< Event > event)
The last symbol of the PPDU has arrived.
 
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
 
static uint64_t m_globalPpduUid
Global counter of the PPDU UID.
 
std::vector< EventId > m_endRxPayloadEvents
the end of receive events (only one unless UL MU reception)
 
virtual Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW)
Get the event corresponding to the incoming PPDU.
 
Ptr< Event > CreateInterferenceEvent(Ptr< const WifiPpdu > ppdu, Time duration, RxPowerWattPerChannelBand &rxPower, bool isStartOfdmaRxing=false)
Create an event using WifiPhy's InterferenceHelper class.
 
double GetRxPowerWForPpdu(Ptr< Event > event) const
Obtain the received power (W) for a given band.
 
Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector) const
 
void NotifyInterferenceRxEndAndClear(bool reset)
Notify WifiPhy's InterferenceHelper of the end of the reception, clear maps and end of MPDU event,...
 
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...
 
virtual void StartTx(Ptr< const WifiPpdu > ppdu)
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
 
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.
 
uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const
 
virtual bool IsModeSupported(WifiMode mode) const
Check if the WifiMode is supported.
 
void ResetReceive(Ptr< Event > event)
Reset PHY at the end of the PPDU under reception after it has failed the PHY header.
 
std::list< WifiMode > m_modeList
the list of supported modes
 
Ptr< const Event > GetCurrentEvent() const
Get the pointer to the current event (stored in WifiPhy).
 
virtual Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
 
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 ...
 
virtual Ptr< const WifiPpdu > GetRxPpduFromTxPpdu(Ptr< const WifiPpdu > ppdu)
The WifiPpdu from the TX PHY is received by each RX PHY attached to the same channel.
 
void AddPreambleEvent(Ptr< Event > event)
Add an entry to the map of current preamble events (stored in WifiPhy).
 
virtual void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu)
Perform amendment-specific actions at the end of the reception of the payload.
 
uint16_t GetCenterFrequencyForChannelWidth(const WifiTxVector &txVector) const
Get the center frequency of the channel corresponding the current TxVector rather than that of the su...
 
virtual std::pair< uint16_t, WifiSpectrumBandInfo > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const
Get the channel width and band to use (will be overloaded by child classes).
 
@ DROP
drop PPDU and set CCA_BUSY
 
void UpdateInterferenceEvent(Ptr< Event > event, const RxPowerWattPerChannelBand &rxPower)
Update an event in WifiPhy's InterferenceHelper class.
 
void ScheduleEndOfMpdus(Ptr< Event > event)
Schedule end of MPDUs events.
 
Smart pointer class similar to boost::intrusive_ptr.
 
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
 
static Time Now()
Return the current simulation virtual time.
 
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
 
Simulation virtual time values and global simulation resolution.
 
int64_t GetNanoSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
 
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
 
bool IsStrictlyPositive() const
Exactly equivalent to t > 0.
 
PHY entity for VHT (11ac)
 
static WifiMode GetVhtMcs0()
Return MCS 0 from VHT MCS values.
 
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied VHT MCS index.
 
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...
 
double GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const override
Return the CCA threshold in dBm for a given channel type.
 
static WifiMode GetVhtMcs5()
Return MCS 5 from VHT MCS values.
 
CcaIndication GetCcaIndication(const Ptr< const WifiPpdu > ppdu) override
Get CCA end time and its corresponding channel list type when a new signal has been received by the P...
 
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...
 
static WifiMode GetVhtMcs3()
Return MCS 3 from VHT MCS values.
 
static WifiMode GetVhtMcs1()
Return MCS 1 from VHT MCS values.
 
static WifiMode GetVhtMcs4()
Return MCS 4 from VHT MCS values.
 
static WifiMode GetVhtMcs2()
Return MCS 2 from VHT MCS values.
 
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied VHT MCS index.
 
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
 
TypeOfStation GetTypeOfStation() const
Return the type of station.
 
static WifiMode CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, WifiModulationClass modClass, bool isMandatory, CodeRateCallback codeRateCallback, ConstellationSizeCallback constellationSizeCallback, PhyRateCallback phyRateCallback, DataRateCallback dataRateCallback, NonHtReferenceRateCallback nonHtReferenceRateCallback, AllowedCallback isAllowedCallback)
 
represent a single transmission mode
 
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
 
uint8_t GetMcsValue() const
 
Ptr< WifiMac > GetMac() const
 
Ptr< HeConfiguration > GetHeConfiguration() const
 
uint32_t GetSubcarrierSpacing() const
 
uint16_t GetChannelWidth() const
 
double GetTxGain() const
Return the transmission gain (dB).
 
void NotifyRxDrop(Ptr< const WifiPsdu > psdu, WifiPhyRxfailureReason reason)
Public method used to fire a PhyRxDrop trace.
 
uint16_t GetFrequency() const
 
uint8_t GetMaxSupportedRxSpatialStreams() const
 
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
 
virtual WifiSpectrumBandFrequencies ConvertIndicesToFrequencies(const WifiSpectrumBandIndices &indices) const =0
This is a helper function to convert start and stop indices to start and stop frequencies.
 
WifiPhyBand GetPhyBand() const
Get the configured Wi-Fi band.
 
static void AddStaticPhyEntity(WifiModulationClass modulation, Ptr< PhyEntity > phyEntity)
Add the PHY entity to the map of implemented PHY entities for the given modulation class.
 
Ptr< WifiNetDevice > GetDevice() const
Return the device this PHY is associated with.
 
virtual WifiSpectrumBandInfo GetBand(uint16_t bandWidth, uint8_t bandIndex=0)=0
Get the info of a given band.
 
double GetTxPowerForTransmission(Ptr< const WifiPpdu > ppdu) const
Compute the transmit power for the next transmission.
 
uint64_t GetPreviouslyRxPpduUid() const
 
Time GetLastRxEndTime() const
Return the end time of the last received packet.
 
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
 
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
 
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...
 
std::set< uint8_t > GetAll20MHzChannelIndicesInPrimary(uint16_t width) const
Get the channel indices of all the 20 MHz channels included in the primary channel of the given width...
 
static Ptr< SpectrumValue > CreateDuplicated20MhzTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40, const std::vector< bool > &puncturedSubchannels=std::vector< bool >{})
Create a transmit power spectral density corresponding to OFDM duplicated over multiple 20 MHz subcha...
 
static Ptr< SpectrumValue > CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, const WifiSpectrumBandIndices &ru)
Create a transmit power spectral density corresponding to the OFDMA part of HE TB PPDUs for a given R...
 
static Ptr< SpectrumValue > CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40, const std::vector< bool > &puncturedSubchannels=std::vector< bool >{})
Create a transmit power spectral density corresponding to OFDM High Efficiency (HE) (802....
 
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
 
bool IsTriggerResponding() const
Return true if the Trigger Responding parameter is set to true, false otherwise.
 
uint16_t GetGuardInterval() const
 
uint8_t GetBssColor() const
Get the BSS color.
 
const RuAllocation & GetRuAllocation(uint8_t p20Index) const
Get RU_ALLOCATION field.
 
std::map< uint16_t, HeMuUserInfo > HeMuUserInfoMap
map of HE MU specific user info parameters indexed by 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.
 
WifiPreamble GetPreambleType() const
 
HeMuUserInfo GetHeMuUserInfo(uint16_t staId) const
Get the HE MU user-specific transmission information for the given STA-ID.
 
HeRu::RuSpec GetRu(uint16_t staId) const
Get the RU specification for the STA-ID.
 
uint16_t GetLength() const
Get the LENGTH field of the L-SIG.
 
const HeMuUserInfoMap & GetHeMuUserInfoMap() const
Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID.
 
WifiModulationClass GetModulationClass() const
Get the modulation class specified by this TXVECTOR.
 
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 GetNssMax() const
 
uint16_t GetChannelWidth() const
 
#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(msg)
Unconditional abnormal program termination with a message.
 
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
 
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
 
#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.
 
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs &&... bargs)
Make Callbacks with varying number of bound arguments.
 
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.
 
Time FemtoSeconds(uint64_t value)
Construct a Time in the indicated unit.
 
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.
 
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)
 
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
 
@ WIFI_MOD_CLASS_HT
HT (Clause 19)
 
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
 
@ WIFI_PPDU_FIELD_SIG_B
SIG-B field.
 
@ WIFI_PPDU_FIELD_TRAINING
STF + LTF fields (excluding those in preamble for HT-GF)
 
@ WIFI_PPDU_FIELD_NON_HT_HEADER
PHY header field for DSSS or ERP, short PHY header field for HR/DSSS or ERP, field not present for HT...
 
@ WIFI_PPDU_FIELD_PREAMBLE
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP,...
 
@ WIFI_PPDU_FIELD_DATA
data field
 
@ WIFI_PPDU_FIELD_SIG_A
SIG-A field.
 
Declaration of ns3::HePhy class and ns3::HeSigAParameters struct.
 
#define HE_PHY
This defines the BSS membership value for HE PHY.
 
class anonymous_namespace{he-phy.cc}::ConstructorHe g_constructor_he
the constructor for HE modes
 
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.
 
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
 
double DbmToW(double dBm)
Convert from dBm to Watts.
 
std::pair< uint32_t, uint32_t > WifiSpectrumBandIndices
typedef for a pair of start and stop sub-band indices
 
std::map< WifiSpectrumBandInfo, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
 
@ LOG_FUNCTION
Function tracing for non-trivial function calls.
 
bool IsDlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a downlink multi-user transmission.
 
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
 
bool IsUlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a uplink multi-user transmission.
 
WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
 
@ WIFI_CODE_RATE_3_4
3/4 coding rate
 
@ WIFI_CODE_RATE_5_6
5/6 coding rate
 
Parameters for received HE-SIG-A for OBSS_PD based SR.
 
Status of the reception of the PPDU field.
 
bool isSuccess
outcome (true if success) of the reception
 
RxSignalInfo structure containing info on the received signal.
 
SignalNoiseDbm structure.
 
WifiSpectrumBandInfo structure containing info about a spectrum band.
 
WifiSpectrumBandIndices indices
the start and stop indices of the band