wifi: Event does not need to store TXVECTOR since it can be retrieved from the PPDU

This commit is contained in:
Sébastien Deronne
2023-08-13 17:52:30 +02:00
committed by Sébastien Deronne
parent cf6bdfc714
commit 45583a3583
13 changed files with 55 additions and 80 deletions

View File

@@ -596,7 +596,7 @@ PhyEntity::PhyFieldRxStatus
HePhy::ProcessSig(Ptr<Event> event, PhyFieldRxStatus status, WifiPpduField field)
{
NS_LOG_FUNCTION(this << *event << status << field);
NS_ASSERT(event->GetTxVector().GetPreambleType() >= WIFI_PREAMBLE_HE_SU);
NS_ASSERT(event->GetPpdu()->GetTxVector().GetPreambleType() >= WIFI_PREAMBLE_HE_SU);
switch (field)
{
case WIFI_PPDU_FIELD_SIG_A:
@@ -614,7 +614,7 @@ HePhy::ProcessSigA(Ptr<Event> event, PhyFieldRxStatus status)
{
NS_LOG_FUNCTION(this << *event << status);
// Notify end of SIG-A (in all cases)
WifiTxVector txVector = event->GetTxVector();
const auto& txVector = event->GetPpdu()->GetTxVector();
HeSigAParameters params;
params.rssiW = GetRxPowerWForPpdu(event);
params.bssColor = txVector.GetBssColor();
@@ -728,7 +728,7 @@ PhyEntity::PhyFieldRxStatus
HePhy::ProcessSigB(Ptr<Event> event, PhyFieldRxStatus status)
{
NS_LOG_FUNCTION(this << *event << status);
NS_ASSERT(IsDlMu(event->GetTxVector().GetPreambleType()));
NS_ASSERT(IsDlMu(event->GetPpdu()->GetTxVector().GetPreambleType()));
if (status.isSuccess)
{
// Check if PPDU is filtered only if the SIG-B content is supported (not explicitly stated
@@ -754,7 +754,7 @@ HePhy::IsConfigSupported(Ptr<const WifiPpdu> ppdu) const
return true; // evaluated in ProcessSigA
}
const WifiTxVector& txVector = ppdu->GetTxVector();
const auto& txVector = ppdu->GetTxVector();
uint16_t staId = GetStaId(ppdu);
WifiMode txMode = txVector.GetMode(staId);
uint8_t nss = txVector.GetNssMax();
@@ -789,7 +789,8 @@ Time
HePhy::DoStartReceivePayload(Ptr<Event> event)
{
NS_LOG_FUNCTION(this << *event);
const auto& txVector = event->GetTxVector();
const auto ppdu = event->GetPpdu();
const auto& txVector = ppdu->GetTxVector();
if (!txVector.IsMu())
{
@@ -797,7 +798,6 @@ HePhy::DoStartReceivePayload(Ptr<Event> event)
}
NS_ASSERT(txVector.GetModulationClass() >= WIFI_MOD_CLASS_HE);
Ptr<const WifiPpdu> ppdu = event->GetPpdu();
if (txVector.IsDlMu())
{

View File

@@ -312,7 +312,7 @@ Time
HePpdu::GetTxDuration() const
{
Time ppduDuration = Seconds(0);
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
const auto length = m_lSig.GetLength();
const auto tSymbol = NanoSeconds(12800 + txVector.GetGuardInterval());
const auto preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration(txVector);
@@ -415,7 +415,7 @@ HePpdu::GetStaId() const
uint16_t
HePpdu::GetTransmissionChannelWidth() const
{
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
if (txVector.IsUlMu() && GetStaId() != SU_STA_ID)
{
TxPsdFlag flag = GetTxPsdFlag();

View File

@@ -407,7 +407,7 @@ PhyEntity::PhyFieldRxStatus
HtPhy::EndReceiveHtSig(Ptr<Event> event)
{
NS_LOG_FUNCTION(this << *event);
NS_ASSERT(event->GetTxVector().GetPreambleType() == WIFI_PREAMBLE_HT_MF);
NS_ASSERT(event->GetPpdu()->GetTxVector().GetPreambleType() == WIFI_PREAMBLE_HT_MF);
SnrPer snrPer = GetPhyHeaderSnrPer(WIFI_PPDU_FIELD_HT_SIG, event);
NS_LOG_DEBUG("HT-SIG: SNR(dB)=" << RatioToDb(snrPer.snr) << ", PER=" << snrPer.per);
PhyFieldRxStatus status(GetRandomValue() > snrPer.per);
@@ -441,7 +441,7 @@ HtPhy::IsAllConfigSupported(WifiPpduField field, Ptr<const WifiPpdu> ppdu) const
bool
HtPhy::IsConfigSupported(Ptr<const WifiPpdu> ppdu) const
{
const WifiTxVector& txVector = ppdu->GetTxVector();
const auto& txVector = ppdu->GetTxVector();
if (txVector.GetNss() > m_wifiPhy->GetMaxSupportedRxSpatialStreams())
{
NS_LOG_DEBUG("Packet reception could not be started because not enough RX antennas");

View File

@@ -109,7 +109,7 @@ HtPpdu::SetTxVectorFromPhyHeaders(WifiTxVector& txVector,
Time
HtPpdu::GetTxDuration() const
{
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
const auto htLength = m_htSig.GetHtLength();
NS_ASSERT(m_operatingChannel.IsSet());
return WifiPhy::CalculateTxDuration(htLength, txVector, m_operatingChannel.GetPhyBand());

View File

@@ -44,12 +44,8 @@ NS_OBJECT_ENSURE_REGISTERED(InterferenceHelper);
* PHY event class
****************************************************************/
Event::Event(Ptr<const WifiPpdu> ppdu,
const WifiTxVector& txVector,
Time duration,
RxPowerWattPerChannelBand&& rxPower)
Event::Event(Ptr<const WifiPpdu> ppdu, Time duration, RxPowerWattPerChannelBand&& rxPower)
: m_ppdu(ppdu),
m_txVector(txVector),
m_startTime(Simulator::Now()),
m_endTime(m_startTime + duration),
m_rxPowerW(std::move(rxPower))
@@ -112,12 +108,6 @@ Event::GetRxPowerWPerBand() const
return m_rxPowerW;
}
const WifiTxVector&
Event::GetTxVector() const
{
return m_txVector;
}
void
Event::UpdateRxPowerW(const RxPowerWattPerChannelBand& rxPower)
{
@@ -138,7 +128,7 @@ std::ostream&
operator<<(std::ostream& os, const Event& event)
{
os << "start=" << event.GetStartTime() << ", end=" << event.GetEndTime()
<< ", TXVECTOR=" << event.GetTxVector() << ", power=" << event.GetRxPowerW() << "W"
<< ", power=" << event.GetRxPowerW() << "W"
<< ", PPDU=" << event.GetPpdu();
return os;
}
@@ -219,12 +209,11 @@ InterferenceHelper::DoDispose()
Ptr<Event>
InterferenceHelper::Add(Ptr<const WifiPpdu> ppdu,
const WifiTxVector& txVector,
Time duration,
RxPowerWattPerChannelBand& rxPowerW,
bool isStartHePortionRxing)
{
Ptr<Event> event = Create<Event>(ppdu, txVector, duration, std::move(rxPowerW));
Ptr<Event> event = Create<Event>(ppdu, duration, std::move(rxPowerW));
AppendEvent(event, isStartHePortionRxing);
return event;
}
@@ -240,7 +229,7 @@ InterferenceHelper::AddForeignSignal(Time duration, RxPowerWattPerChannelBand& r
Ptr<WifiPpdu> fakePpdu = Create<WifiPpdu>(Create<WifiPsdu>(Create<Packet>(0), hdr),
WifiTxVector(),
WifiPhyOperatingChannel());
Add(fakePpdu, WifiTxVector(), duration, rxPowerW);
Add(fakePpdu, duration, rxPowerW);
}
bool
@@ -531,14 +520,14 @@ InterferenceHelper::CalculatePayloadPer(Ptr<const Event> event,
const auto& niIt = nis->find(band)->second;
auto j = niIt.cbegin();
Time previous = j->first;
WifiMode payloadMode = event->GetTxVector().GetMode(staId);
WifiMode payloadMode = event->GetPpdu()->GetTxVector().GetMode(staId);
Time phyPayloadStart = j->first;
if (event->GetPpdu()->GetType() != WIFI_PPDU_TYPE_UL_MU &&
event->GetPpdu()->GetType() !=
WIFI_PPDU_TYPE_DL_MU) // j->first corresponds to the start of the MU payload
{
phyPayloadStart =
j->first + WifiPhy::CalculatePhyPreambleAndHeaderDuration(event->GetTxVector());
phyPayloadStart = j->first + WifiPhy::CalculatePhyPreambleAndHeaderDuration(
event->GetPpdu()->GetTxVector());
}
Time windowStart = phyPayloadStart + window.first;
Time windowEnd = phyPayloadStart + window.second;
@@ -553,13 +542,13 @@ InterferenceHelper::CalculatePayloadPer(Ptr<const Event> event,
double snr = CalculateSnr(powerW,
noiseInterferenceW,
channelWidth,
event->GetTxVector().GetNss(staId));
event->GetPpdu()->GetTxVector().GetNss(staId));
// Case 1: Both previous and current point to the windowed payload
if (previous >= windowStart)
{
psr *= CalculatePayloadChunkSuccessRate(snr,
Min(windowEnd, current) - previous,
event->GetTxVector(),
event->GetPpdu()->GetTxVector(),
staId);
NS_LOG_DEBUG("Both previous and current point to the windowed payload: mode="
<< payloadMode << ", psr=" << psr);
@@ -569,7 +558,7 @@ InterferenceHelper::CalculatePayloadPer(Ptr<const Event> event,
{
psr *= CalculatePayloadChunkSuccessRate(snr,
Min(windowEnd, current) - windowStart,
event->GetTxVector(),
event->GetPpdu()->GetTxVector(),
staId);
NS_LOG_DEBUG(
"previous is before windowed payload and current is in the windowed payload: mode="
@@ -631,7 +620,7 @@ InterferenceHelper::CalculatePhyHeaderSectionPsr(
psr *= CalculateChunkSuccessRate(snr,
duration,
section.second.second,
event->GetTxVector(),
event->GetPpdu()->GetTxVector(),
section.first);
NS_LOG_DEBUG("Current NI change in "
<< section.first << " [" << start << ", " << stop << "] for "
@@ -661,11 +650,12 @@ InterferenceHelper::CalculatePhyHeaderPer(Ptr<const Event> event,
{
NS_LOG_FUNCTION(this << band << header);
auto niIt = nis->find(band)->second;
auto phyEntity = WifiPhy::GetStaticPhyEntity(event->GetTxVector().GetModulationClass());
auto phyEntity =
WifiPhy::GetStaticPhyEntity(event->GetPpdu()->GetTxVector().GetModulationClass());
PhyEntity::PhyHeaderSections sections;
for (const auto& section :
phyEntity->GetPhyHeaderSections(event->GetTxVector(), niIt.begin()->first))
phyEntity->GetPhyHeaderSections(event->GetPpdu()->GetTxVector(), niIt.begin()->first))
{
if (section.first == header)
{
@@ -695,7 +685,7 @@ InterferenceHelper::CalculatePayloadSnrPer(Ptr<Event> event,
double snr = CalculateSnr(event->GetRxPowerW(band),
noiseInterferenceW,
channelWidth,
event->GetTxVector().GetNss(staId));
event->GetPpdu()->GetTxVector().GetNss(staId));
/* calculate the SNIR at the start of the MPDU (located through windowing) and accumulate
* all SNIR changes in the SNIR vector.

View File

@@ -44,14 +44,10 @@ class Event : public SimpleRefCount<Event>
* be moved into this object.
*
* \param ppdu the PPDU
* \param txVector the TXVECTOR
* \param duration duration of the PPDU
* \param rxPower the received power per band (W)
*/
Event(Ptr<const WifiPpdu> ppdu,
const WifiTxVector& txVector,
Time duration,
RxPowerWattPerChannelBand&& rxPower);
Event(Ptr<const WifiPpdu> ppdu, Time duration, RxPowerWattPerChannelBand&& rxPower);
~Event();
/**
@@ -97,12 +93,6 @@ class Event : public SimpleRefCount<Event>
* \return the received power (W) for all bands.
*/
const RxPowerWattPerChannelBand& GetRxPowerWPerBand() const;
/**
* Return the TXVECTOR of the PPDU.
*
* \return the TXVECTOR of the PPDU
*/
const WifiTxVector& GetTxVector() const;
/**
* Update the received power (W) for all bands, i.e. add up the received power
* to the current received power, for each band.
@@ -113,7 +103,6 @@ class Event : public SimpleRefCount<Event>
private:
Ptr<const WifiPpdu> m_ppdu; //!< PPDU
WifiTxVector m_txVector; //!< TXVECTOR
Time m_startTime; //!< start time
Time m_endTime; //!< end time
RxPowerWattPerChannelBand m_rxPowerW; //!< received power in watts per band
@@ -209,7 +198,6 @@ class InterferenceHelper : public Object
* Add the PPDU-related signal to interference helper.
*
* \param ppdu the PPDU
* \param txVector the TXVECTOR
* \param duration the PPDU duration
* \param rxPower received power per band (W)
* \param isStartHePortionRxing flag whether the event corresponds to the start of the HE
@@ -218,7 +206,6 @@ class InterferenceHelper : public Object
* \return Event
*/
Ptr<Event> Add(Ptr<const WifiPpdu> ppdu,
const WifiTxVector& txVector,
Time duration,
RxPowerWattPerChannelBand& rxPower,
bool isStartHePortionRxing = false);

View File

@@ -80,7 +80,7 @@ DsssPpdu::SetTxVectorFromDsssHeader(WifiTxVector& txVector, const DsssSigHeader&
Time
DsssPpdu::GetTxDuration() const
{
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
const auto length = m_dsssSig.GetLength();
return (MicroSeconds(length) + WifiPhy::CalculatePhyPreambleAndHeaderDuration(txVector));
}

View File

@@ -83,7 +83,7 @@ OfdmPpdu::SetTxVectorFromLSigHeader(WifiTxVector& txVector, const LSigHeader& lS
Time
OfdmPpdu::GetTxDuration() const
{
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
const auto length = m_lSig.GetLength();
NS_ASSERT(m_operatingChannel.IsSet());
return WifiPhy::CalculateTxDuration(length, txVector, m_operatingChannel.GetPhyBand());

View File

@@ -295,7 +295,7 @@ PhyEntity::StartReceiveField(WifiPpduField field, Ptr<Event> event)
NS_ABORT_MSG_IF(!supported,
"Unknown field "
<< field << " for this PHY entity"); // TODO see what to do if not supported
Time duration = GetDuration(field, event->GetTxVector());
Time duration = GetDuration(field, event->GetPpdu()->GetTxVector());
m_wifiPhy->m_endPhyRxEvent =
Simulator::Schedule(duration, &PhyEntity::EndReceiveField, this, field, event);
m_wifiPhy->NotifyCcaBusy(
@@ -310,7 +310,7 @@ PhyEntity::EndReceiveField(WifiPpduField field, Ptr<Event> event)
NS_ASSERT(m_wifiPhy); // no sense if no owner WifiPhy instance
NS_ASSERT(m_wifiPhy->m_endPhyRxEvent.IsExpired());
PhyFieldRxStatus status = DoEndReceiveField(field, event);
WifiTxVector txVector = event->GetTxVector();
const auto& txVector = event->GetPpdu()->GetTxVector();
if (status.isSuccess) // move to next field if reception succeeded
{
StartReceiveField(GetNextField(field, txVector.GetPreambleType()), event);
@@ -358,7 +358,7 @@ PhyEntity::EndReceiveField(WifiPpduField field, Ptr<Event> event)
Time
PhyEntity::GetRemainingDurationAfterField(Ptr<const WifiPpdu> ppdu, WifiPpduField field) const
{
const WifiTxVector& txVector = ppdu->GetTxVector();
const auto& txVector = ppdu->GetTxVector();
return ppdu->GetTxDuration() -
(GetDurationUpToField(field, txVector) + GetDuration(field, txVector));
}
@@ -586,7 +586,7 @@ PhyEntity::DoStartReceivePayload(Ptr<Event> event)
m_signalNoiseMap.insert({std::make_pair(ppdu->GetUid(), staId), SignalNoiseDbm()});
m_statusPerMpduMap.insert({std::make_pair(ppdu->GetUid(), staId), std::vector<bool>()});
ScheduleEndOfMpdus(event);
const WifiTxVector& txVector = event->GetTxVector();
const auto& txVector = event->GetPpdu()->GetTxVector();
Time payloadDuration = ppdu->GetTxDuration() - CalculatePhyPreambleAndHeaderDuration(txVector);
m_wifiPhy->m_phyRxPayloadBeginTrace(
txVector,
@@ -604,7 +604,7 @@ PhyEntity::ScheduleEndOfMpdus(Ptr<Event> event)
NS_LOG_FUNCTION(this << *event);
Ptr<const WifiPpdu> ppdu = event->GetPpdu();
Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu(ppdu);
const WifiTxVector& txVector = event->GetTxVector();
const auto& txVector = event->GetPpdu()->GetTxVector();
uint16_t staId = GetStaId(ppdu);
Time endOfMpduDuration = NanoSeconds(0);
Time relativeStart = NanoSeconds(0);
@@ -668,8 +668,8 @@ PhyEntity::EndOfMpdu(Ptr<Event> event,
Time mpduDuration)
{
NS_LOG_FUNCTION(this << *event << mpduIndex << relativeStart << mpduDuration);
Ptr<const WifiPpdu> ppdu = event->GetPpdu();
WifiTxVector txVector = event->GetTxVector();
const auto ppdu = event->GetPpdu();
const auto& txVector = ppdu->GetTxVector();
uint16_t staId = GetStaId(ppdu);
std::pair<bool, SignalNoiseDbm> rxInfo =
@@ -700,13 +700,14 @@ PhyEntity::EndOfMpdu(Ptr<Event> event,
void
PhyEntity::EndReceivePayload(Ptr<Event> event)
{
Ptr<const WifiPpdu> ppdu = event->GetPpdu();
WifiTxVector txVector = event->GetTxVector();
Time psduDuration = ppdu->GetTxDuration() - CalculatePhyPreambleAndHeaderDuration(txVector);
const auto ppdu = event->GetPpdu();
const auto& txVector = ppdu->GetTxVector();
const auto psduDuration =
ppdu->GetTxDuration() - CalculatePhyPreambleAndHeaderDuration(txVector);
NS_LOG_FUNCTION(this << *event << psduDuration);
NS_ASSERT(event->GetEndTime() == Simulator::Now());
uint16_t staId = GetStaId(ppdu);
const auto& channelWidthAndBand = GetChannelWidthAndBand(event->GetTxVector(), staId);
const auto staId = GetStaId(ppdu);
const auto channelWidthAndBand = GetChannelWidthAndBand(txVector, staId);
double snr = m_wifiPhy->m_interference->CalculateSnr(event,
channelWidthAndBand.first,
txVector.GetNss(staId),
@@ -786,7 +787,8 @@ PhyEntity::GetReceptionStatus(Ptr<const WifiPsdu> psdu,
Time mpduDuration)
{
NS_LOG_FUNCTION(this << *psdu << *event << staId << relativeMpduStart << mpduDuration);
const auto& channelWidthAndBand = GetChannelWidthAndBand(event->GetTxVector(), staId);
const auto& channelWidthAndBand =
GetChannelWidthAndBand(event->GetPpdu()->GetTxVector(), staId);
SnrPer snrPer = m_wifiPhy->m_interference->CalculatePayloadSnrPer(
event,
channelWidthAndBand.first,
@@ -794,8 +796,8 @@ PhyEntity::GetReceptionStatus(Ptr<const WifiPsdu> psdu,
staId,
std::make_pair(relativeMpduStart, relativeMpduStart + mpduDuration));
WifiMode mode = event->GetTxVector().GetMode(staId);
NS_LOG_DEBUG("rate=" << (mode.GetDataRate(event->GetTxVector(), staId))
WifiMode mode = event->GetPpdu()->GetTxVector().GetMode(staId);
NS_LOG_DEBUG("rate=" << (mode.GetDataRate(event->GetPpdu()->GetTxVector(), staId))
<< ", SNR(dB)=" << RatioToDb(snrPer.snr) << ", PER=" << snrPer.per
<< ", size=" << psdu->GetSize()
<< ", relativeStart = " << relativeMpduStart.As(Time::NS)
@@ -886,11 +888,7 @@ PhyEntity::CreateInterferenceEvent(Ptr<const WifiPpdu> ppdu,
RxPowerWattPerChannelBand& rxPower,
bool isStartHePortionRxing /* = false */)
{
return m_wifiPhy->m_interference->Add(ppdu,
ppdu->GetTxVector(),
duration,
rxPower,
isStartHePortionRxing);
return m_wifiPhy->m_interference->Add(ppdu, duration, rxPower, isStartHePortionRxing);
}
void
@@ -1045,8 +1043,9 @@ PhyEntity::EndPreambleDetectionPeriod(Ptr<Event> event)
m_wifiPhy->m_timeLastPreambleDetected = Simulator::Now();
// Continue receiving preamble
Time durationTillEnd = GetDuration(WIFI_PPDU_FIELD_PREAMBLE, event->GetTxVector()) -
m_wifiPhy->GetPreambleDetectionDuration();
Time durationTillEnd =
GetDuration(WIFI_PPDU_FIELD_PREAMBLE, event->GetPpdu()->GetTxVector()) -
m_wifiPhy->GetPreambleDetectionDuration();
m_wifiPhy->NotifyCcaBusy(event->GetPpdu(),
durationTillEnd); // will be prolonged by next field
m_wifiPhy->m_endPhyRxEvent = Simulator::Schedule(durationTillEnd,

View File

@@ -407,11 +407,10 @@ SpectrumWifiPhy::StartRx(Ptr<SpectrumSignalParameters> rxParams,
// Compare received TX power per MHz to normalized RX sensitivity
const auto txWidth = wifiRxParams->txWidth;
const auto& ppdu = GetRxPpduFromTxPpdu(wifiRxParams->ppdu);
const auto& txVector = ppdu->GetTxVector();
if (totalRxPowerW < DbmToW(GetRxSensitivity()) * (txWidth / 20.0))
{
NS_LOG_INFO("Received signal too weak to process: " << WToDbm(totalRxPowerW) << " dBm");
m_interference->Add(ppdu, txVector, rxDuration, rxPowerW);
m_interference->Add(ppdu, rxDuration, rxPowerW);
SwitchMaybeToCcaBusy(nullptr);
return;
}
@@ -421,7 +420,7 @@ SpectrumWifiPhy::StartRx(Ptr<SpectrumSignalParameters> rxParams,
if (!CanStartRx(ppdu, txWidth))
{
NS_LOG_INFO("Cannot start reception of the PPDU, consider it as interference");
m_interference->Add(ppdu, txVector, rxDuration, rxPowerW);
m_interference->Add(ppdu, rxDuration, rxPowerW);
SwitchMaybeToCcaBusy(ppdu);
return;
}

View File

@@ -314,7 +314,7 @@ PhyEntity::PhyFieldRxStatus
VhtPhy::ProcessSig(Ptr<Event> event, PhyFieldRxStatus status, WifiPpduField field)
{
NS_LOG_FUNCTION(this << *event << status << field);
NS_ASSERT(event->GetTxVector().GetPreambleType() >= WIFI_PREAMBLE_VHT_SU);
NS_ASSERT(event->GetPpdu()->GetTxVector().GetPreambleType() >= WIFI_PREAMBLE_VHT_SU);
// TODO see if something should be done here once MU-MIMO is supported
return status; // nothing special for VHT
}

View File

@@ -111,7 +111,7 @@ VhtPpdu::SetTxVectorFromPhyHeaders(WifiTxVector& txVector,
Time
VhtPpdu::GetTxDuration() const
{
const WifiTxVector& txVector = GetTxVector();
const auto& txVector = GetTxVector();
const auto length = m_lSig.GetLength();
const auto sgi = m_vhtSig.GetShortGuardInterval();
const auto sgiDisambiguation = m_vhtSig.GetShortGuardIntervalDisambiguation();

View File

@@ -1874,7 +1874,7 @@ WifiPhy::StartReceivePreamble(Ptr<const WifiPpdu> ppdu,
// TODO find a fallback PHY for receiving the PPDU (e.g. 11a for 11ax due to preamble
// structure)
NS_LOG_DEBUG("Unsupported modulation received (" << modulation << "), consider as noise");
m_interference->Add(ppdu, ppdu->GetTxVector(), rxDuration, rxPowersW);
m_interference->Add(ppdu, rxDuration, rxPowersW);
SwitchMaybeToCcaBusy(nullptr);
}
}