30 #include "ns3/packet.h" 31 #include "ns3/simulator.h" 33 #include "ns3/assert.h" 45 return (os <<
"DROP");
47 return (os <<
"ABORT");
49 return (os <<
"IGNORE");
52 return (os <<
"unknown");
60 return os <<
"success";
111 NS_ABORT_MSG (
"This method should be used only for HtPhy and child classes. Use GetMode instead.");
118 NS_ABORT_MSG (
"This method should be used only for HtPhy and child classes. Use IsModeSupported instead.");
128 std::list<WifiMode>::const_iterator
134 std::list<WifiMode>::const_iterator
143 NS_FATAL_ERROR (
"PPDU field is not a SIG field (no sense in retrieving the signaled mode) or is unsupported: " << field);
151 const auto itPpdu = ppduFormats.find (preamble);
152 if (itPpdu != ppduFormats.end ())
154 const auto itField = std::find (itPpdu->second.begin (), itPpdu->second.end (), currentField);
155 if (itField != itPpdu->second.end ())
157 const auto itNextField = std::next (itField, 1);
158 if (itNextField != itPpdu->second.end ())
160 return *(itNextField);
162 NS_FATAL_ERROR (
"No field after " << currentField <<
" for " << preamble <<
" for the provided PPDU formats");
166 NS_FATAL_ERROR (
"Unsupported PPDU field " << currentField <<
" for " << preamble <<
" for the provided PPDU formats");
171 NS_FATAL_ERROR (
"Unsupported preamble " << preamble <<
" for the provided PPDU formats");
191 duration +=
GetDuration (static_cast<WifiPpduField> (field), txVector);
205 return ppdu->GetPsdu ();
218 map[field] = std::make_pair (std::make_pair (
start,
start + duration),
231 NS_FATAL_ERROR (
"This method is unsupported for the base PhyEntity class. Use the overloaded version in the amendment-specific subclasses instead!");
232 return Create<WifiPpdu> (psdus.begin ()->second, txVector);
243 auto it = sections.find (field);
245 const auto & startStopTimes = it->second.first;
246 return startStopTimes.first;
272 NS_ABORT_MSG_IF (!supported,
"Unknown field " << field <<
" for this PHY entity");
275 m_state->SwitchMaybeToCcaBusy (duration);
286 if (status.isSuccess)
293 switch (status.actionIfFailure)
337 auto itFormat = ppduFormats.find (event->GetPpdu ()->GetPreamble ());
338 if (itFormat != ppduFormats.end ())
340 auto itField = std::find (itFormat->second.begin (), itFormat->second.end (), field);
341 if (itField != itFormat->second.end ())
366 auto it = std::max_element (rxPowersW.begin (), rxPowersW.end (),
367 [] (
const std::pair<WifiSpectrumBand, double> &p1,
const std::pair<WifiSpectrumBand, double> &p2) {
368 return p1.second < p2.second;
371 Time rxDuration = ppdu->GetTxDuration ();
374 if (event ==
nullptr)
391 if (ppdu->IsTruncatedTx ())
393 NS_LOG_DEBUG (
"Packet reception stopped because transmitter has been switched off");
404 NS_LOG_DEBUG (
"Drop packet because of channel switching");
457 NS_LOG_DEBUG (
"Drop packet because already decoding preamble");
483 NS_LOG_FUNCTION (
this << ppdu << reason << endRx << measurementChannelWidth);
511 if (rxDuration >
m_state->GetDelayUntilIdle ())
533 m_state->SwitchToRx (payloadDuration);
547 m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), staId), std::vector<bool> ()});
564 Time remainingAmpduDuration = psduDuration;
567 uint32_t totalAmpduSize = 0;
568 double totalAmpduNumSymbols = 0.0;
569 auto mpdu = psdu->
begin ();
570 for (
size_t i = 0; i < nMpdus && mpdu != psdu->
end (); ++mpdu)
575 totalAmpduNumSymbols, staId);
577 remainingAmpduDuration -= mpduDuration;
578 if (i == (nMpdus - 1) && !remainingAmpduDuration.
IsZero ())
582 mpduDuration += remainingAmpduDuration;
586 endOfMpduDuration += mpduDuration;
588 " (relativeStart=" << relativeStart.
As (
Time::NS) <<
", mpduDuration=" << mpduDuration.
As (
Time::NS) <<
589 ", remainingAmdpuDuration=" << remainingAmpduDuration.
As (
Time::NS) <<
")");
594 relativeStart += mpduDuration;
602 NS_LOG_FUNCTION (
this << *event << mpduIndex << relativeStart << mpduDuration);
609 std::pair<bool, SignalNoiseDbm> rxInfo =
GetReceptionStatus (psdu, event, staId, relativeStart, mpduDuration);
611 ", correct reception: " << rxInfo.first <<
", Signal/Noise: " << rxInfo.second.signal <<
"/" << rxInfo.second.noise <<
"dBm");
613 auto signalNoiseIt =
m_signalNoiseMap.find (std::make_pair (ppdu->GetUid (), staId));
615 signalNoiseIt->second = rxInfo.second;
618 rxSignalInfo.
snr = snr;
619 rxSignalInfo.
rssi = rxInfo.second.signal;
621 auto statusPerMpduIt =
m_statusPerMpduMap.find (std::make_pair (ppdu->GetUid (), staId));
623 statusPerMpduIt->second.push_back (rxInfo.first);
628 m_state->ContinueRxNextMpdu (
Copy (psdu), rxSignalInfo, txVector);
647 auto signalNoiseIt =
m_signalNoiseMap.find (std::make_pair (ppdu->GetUid (), staId));
649 auto statusPerMpduIt =
m_statusPerMpduMap.find (std::make_pair (ppdu->GetUid (), staId));
652 if (std::count (statusPerMpduIt->second.begin (), statusPerMpduIt->second.end (),
true))
657 rxSignalInfo.
snr = snr;
658 rxSignalInfo.
rssi = signalNoiseIt->second.signal;
659 m_state->SwitchFromRxEndOk (
Copy (psdu), rxSignalInfo, txVector, staId, statusPerMpduIt->second);
683 std::pair<bool, SignalNoiseDbm>
685 Time relativeMpduStart,
Time mpduDuration)
687 NS_LOG_FUNCTION (
this << *psdu << *event << staId << relativeMpduStart << mpduDuration);
690 std::make_pair (relativeMpduStart, relativeMpduStart + mpduDuration));
692 WifiMode mode =
event->GetTxVector ().GetMode (staId);
694 ", SNR(dB)=" <<
RatioToDb (snrPer.snr) <<
", PER=" << snrPer.per <<
", size=" << psdu->
GetSize () <<
695 ", relativeStart = " << relativeMpduStart.
As (
Time::NS) <<
", duration = " << mpduDuration.
As (
Time::NS));
702 signalNoise.
signal =
WToDbm (event->GetRxPowerW (channelWidthAndBand.second));
703 signalNoise.noise =
WToDbm (event->GetRxPowerW (channelWidthAndBand.second) / snrPer.snr);
708 return std::make_pair (
true, signalNoise);
713 return std::make_pair (
false, signalNoise);
717 std::pair<uint16_t, WifiSpectrumBand>
724 const std::map <std::pair<uint64_t, WifiPreamble>,
Ptr<Event> > &
744 auto uidPreamblePair = std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ());
806 double maxRxPowerW = -1;
811 double rxPowerW = preambleEvent.second->GetRxPowerW (measurementBand);
812 if (rxPowerW > maxRxPowerW)
814 maxRxPowerW = rxPowerW;
815 maxEvent = preambleEvent.second;
820 if (maxEvent != event)
822 NS_LOG_DEBUG (
"Receiver got a stronger packet with UID " << maxEvent->GetPpdu ()->GetUid () <<
" during preamble detection: drop packet with UID " <<
event->GetPpdu ()->GetUid ());
844 it.second->CancelRunningEndPreambleDetectionEvents (
true);
851 NS_LOG_DEBUG (
"Drop packet with UID " << it->first.first <<
" and preamble " << it->first.second <<
" arrived at time " << it->second->GetStartTime ());
880 m_state->SwitchMaybeToCcaBusy (durationTillEnd);
885 NS_LOG_DEBUG (
"Drop packet because PHY preamble detection failed");
903 WifiMode txMode = ppdu->GetTxVector ().GetMode ();
906 NS_LOG_DEBUG (
"Drop packet because it was sent using an unsupported mode (" << txMode <<
")");
918 endPreambleDetectionEvent.Cancel ();
923 endRxPayloadEvent.Cancel ();
940 if (endPreambleDetectionEvent.IsRunning ())
942 endPreambleDetectionEvent.Cancel ();
967 endMpduEvent.Cancel ();
1039 Transmit (ppdu->GetTxDuration (), ppdu,
"transmission");
1047 NS_LOG_DEBUG (
"Start " << type <<
": signal power before antenna gain=" <<
WToDbm (txPowerWatts) <<
"dBm");
1050 txParams->duration = txDuration;
1051 txParams->psd = txPowerSpectrum;
1052 txParams->ppdu = ppdu;
1055 auto spectrumWifiPhy = DynamicCast<SpectrumWifiPhy> (
m_wifiPhy);
1057 spectrumWifiPhy->Transmit (txParams);
1066 std::tuple<double, double, double>
1076 const auto & it = psduMap.begin ();
std::pair< bool, SignalNoiseDbm > GetReceptionStatus(Ptr< const WifiPsdu > psdu, Ptr< Event > event, uint16_t staId, Time relativeMpduStart, Time mpduDuration)
Get the reception status for the provided MPDU and notify.
void NotifyRxDrop(Ptr< const WifiPsdu > psdu, WifiPhyRxfailureReason reason)
Public method used to fire a PhyRxDrop trace.
Ptr< const Event > GetCurrentEvent(void) const
Get the pointer to the current event (stored in WifiPhy).
virtual PhyFieldRxStatus DoEndReceiveField(WifiPpduField field, Ptr< Event > event)
End receiving a given field, perform amendment-specific actions, and provide the status of the recept...
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
void NotifyRxEnd(Time endTime)
Notify that RX has ended.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
double signal
signal strength in dBm
bool IsSingle(void) const
Return true if the PSDU is an S-MPDU.
Simulation virtual time values and global simulation resolution.
std::map< UidStaIdPair, SignalNoiseDbm > m_signalNoiseMap
Map of the latest signal power and noise power in dBm (noise power includes the noise figure) ...
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Time GetRemainingDurationAfterField(Ptr< const WifiPpdu > ppdu, WifiPpduField field) const
Get the remaining duration of the PPDU after the end of the given field.
void AbortCurrentReception(WifiPhyRxfailureReason reason)
Abort the current reception.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
double Integral(const SpectrumValue &arg)
void AbortCurrentReception(WifiPhyRxfailureReason reason)
Due to newly arrived signal, the current reception cannot be continued and has to be aborted...
PhyRxFailureAction actionIfFailure
action to perform in case of failure
void ResetReceive(Ptr< Event > event)
Reset PHY at the end of the PPDU under reception after it has failed the PHY header.
std::size_t GetAmpduSubframeSize(std::size_t i) const
Return the size of the i-th A-MPDU subframe.
std::vector< EventId > m_endOfMpduEvents
the end of MPDU events (only used for A-MPDUs)
void UpdateEvent(Ptr< Event > event, RxPowerWattPerChannelBand rxPower)
Update event to scale its received power (W) per band.
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Time m_timeLastPreambleDetected
Record the time the last preamble was detected.
double DbmToW(double dBm)
Convert from dBm to Watts.
WifiPhyRxfailureReason reason
failure reason
virtual void DoAbortCurrentReception(WifiPhyRxfailureReason reason)
Perform amendment-specific actions before aborting the current reception.
The PHY layer is sleeping.
WifiSpectrumBand GetPrimaryBand(uint16_t bandWidth)
If the operating channel width is a multiple of 20 MHz, return the start band index and the stop band...
virtual Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW)
Get the event corresponding to the incoming PPDU.
virtual PhyFieldRxStatus DoEndReceivePreamble(Ptr< Event > event)
End receiving the preamble, perform amendment-specific actions, and provide the status of the recepti...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual void StartTx(Ptr< WifiPpdu > ppdu)
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
TracedCallback< WifiTxVector, Time > m_phyRxPayloadBeginTrace
The trace source fired when the reception of the PHY payload (PSDU) begins.
EventId m_endPhyRxEvent
the end of PHY receive event
void StartPreambleDetectionPeriod(Ptr< Event > event)
Start the preamble detection period.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
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.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
uint16_t GetGuardInterval(void) const
virtual bool HandlesMcsModes(void) const
Check if the WifiModes handled by this PHY are MCSs.
void Reset(void)
Reset data upon end of TX or RX.
bool NoEndPreambleDetectionEvents(void) const
uint16_t GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const
Get the center frequency of the primary channel of the given width.
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.
std::list< WifiMode >::const_iterator begin(void) const
Return a const iterator to the first WifiMode.
void StartReceivePayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
std::vector< Ptr< WifiMacQueueItem > >::const_iterator end(void) const
Return a const iterator to past-the-last MPDU.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
void NotifyRxEnd(Ptr< const WifiPsdu > psdu)
Public method used to fire a PhyRxEnd trace.
virtual const PpduFormats & GetPpduFormats(void) const =0
Return the PPDU formats of the PHY.
const std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > & GetCurrentPreambleEvents(void) const
Get the map of current preamble events (stored in WifiPhy).
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
SpectrumModelUid_t GetUid() const
std::map< WifiPpduField, PhyHeaderChunkInfo > PhyHeaderSections
A map of PhyHeaderChunkInfo elements per PPDU field.
MpduType
The type of an MPDU.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
uint16_t GetChannelWidth(void) const
PhyRxFailureAction
Action to perform in case of RX failure.
WifiPreamble GetPreambleType(void) const
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP, HT-GF-STF + HT-GF-LTF1 fields for HT-GF, L-STF + L-LTF fields otherwise.
std::ostream & operator<<(std::ostream &os, const Angles &a)
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
std::tuple< double, double, double > GetTxMaskRejectionParams(void) const
void SwitchMaybeToCcaBusy(uint16_t channelWidth)
Check if PHY state should move to CCA busy state based on current state of interference tracker...
virtual ~PhyEntity()
Destructor for PHY entity.
Ptr< Event > Add(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false)
Add the PPDU-related signal to interference helper.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
The MPDU is not part of an A-MPDU.
Ptr< const Packet > GetPacket(void) const
Get the PSDU as a single packet.
virtual Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
RxSignalInfo structure containing info on the received signal.
The MPDU is the first aggregate in an A-MPDU with multiple MPDUs, but is not the last aggregate...
void EndOfMpdu(Ptr< Event > event, Ptr< const WifiPsdu > psdu, size_t mpduIndex, Time relativeStart, Time mpduDuration)
The last symbol of an MPDU in an A-MPDU has arrived.
SnrPer GetPhyHeaderSnrPer(WifiPpduField field, Ptr< Event > event) const
Obtain the SNR and PER of the PPDU field from the WifiPhy's InterferenceHelper class.
virtual std::pair< uint16_t, WifiSpectrumBand > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const
Get the channel width and band to use (will be overloaded by child classes).
bool IsZero(void) const
Exactly equivalent to t == 0.
Status of the reception of the PPDU field.
virtual bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
virtual std::tuple< double, double, double > GetTxMaskRejectionParams(void) const =0
void DropPreambleEvent(Ptr< const WifiPpdu > ppdu, WifiPhyRxfailureReason reason, Time endRx, uint16_t measurementChannelWidth)
Drop the PPDU and the corresponding preamble detection event, but keep CCA busy state after the compl...
The MPDU is part of an A-MPDU with multiple MPDUs, but is neither the first nor the last aggregate...
uint64_t m_previouslyRxPpduUid
UID of the previously received PPDU, reset to UINT64_MAX upon transmission.
WifiPpduField
The type of PPDU field (grouped for convenience)
void EndReceivePayload(Ptr< Event > event)
The last symbol of the PPDU has arrived.
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const
Return the channel width used to measure the RSSI.
The PHY layer has sense the medium busy through the CCA mechanism.
virtual void StartReceivePreamble(Ptr< WifiPpdu > ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration)
Start receiving the PHY preamble of a PPDU (i.e.
virtual bool IsMcsSupported(uint8_t index) const
Check if the WifiMode corresponding to the given MCS index is supported.
std::vector< EventId > m_endPreambleDetectionEvents
the end of preamble detection events
virtual Time GetDuration(WifiPpduField field, const WifiTxVector &txVector) const
Get the duration of the PPDU field (or group of fields) used by this entity for the given transmissio...
virtual uint64_t ObtainNextUid(const WifiTxVector &txVector)
Obtain the next UID for the PPDU to transmit.
uint16_t GetCenterFrequencyForChannelWidth(const WifiTxVector &txVector) const
Get the center frequency of the channel corresponding the current TxVector rather than that of the su...
bool isSuccess
outcome (true if success) of the reception
void ScheduleEndOfMpdus(Ptr< Event > event)
Schedule end of MPDUs events.
A struct for both SNR and PER.
virtual uint16_t GetRxChannelWidth(const WifiTxVector &txVector) const
Return the channel width used in the reception spectrum model.
Ptr< PreambleDetectionModel > m_preambleDetectionModel
Preamble detection model.
virtual Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration)
Build amendment-specific PPDU.
virtual uint8_t GetNumModes(void) const
void SetOwner(Ptr< WifiPhy > wifiPhy)
Set the WifiPhy owning this PHY entity.
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 ...
static Time GetPreambleDetectionDuration(void)
Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector) const
Ptr< WifiPhyStateHelper > m_state
Pointer to WifiPhyStateHelper of the WifiPhy (to make it reachable for child classes) ...
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
virtual WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const
Get the WifiMode for the SIG field specified by the PPDU field.
std::vector< EventId > m_endRxPayloadEvents
the end of receive events (only one unless UL MU reception)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void NotifyRxStart()
Notify that RX has started.
virtual WifiConstPsduMap GetWifiConstPsduMap(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector) const
Get a WifiConstPsduMap from a PSDU and the TXVECTOR to use to send the PSDU.
uint16_t GetFrequency(void) const
void Transmit(Time txDuration, Ptr< WifiPpdu > ppdu, std::string type)
This function prepares most of the WifiSpectrumSignalParameters parameters and invokes SpectrumWifiPh...
void UpdateInterferenceEvent(Ptr< Event > event, RxPowerWattPerChannelBand rxPower)
Update an event in WifiPhy's InterferenceHelper class.
virtual uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const =0
static uint64_t m_globalPpduUid
Global counter of the PPDU UID.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
virtual void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu)
Perform amendment-specific actions at the end of the reception of the payload.
std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > m_currentPreambleEvents
store event associated to a PPDU (that has a unique ID and preamble combination) whose preamble is be...
virtual WifiMode GetMcs(uint8_t index) const
Get the WifiMode corresponding to the given MCS index.
void AddPreambleEvent(Ptr< Event > event)
Add an entry to the map of current preamble events (stored in WifiPhy).
Ptr< const SpectrumModel > GetSpectrumModel() const
double WToDbm(double w)
Convert from Watts to dBm.
uint8_t GetChannelNumber(void) const
Return current channel number.
virtual void DoStartReceivePayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
static Time Now(void)
Return the current simulation virtual time.
Ptr< UniformRandomVariable > m_random
Provides uniform random variables.
Ptr< Event > CreateInterferenceEvent(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false)
Create an event using WifiPhy's InterferenceHelper class.
drop PPDU and set CCA_BUSY
double RatioToDb(double ratio)
Convert from ratio to dB.
Ptr< ErrorModel > m_postReceptionErrorModel
Error model for receive packet events.
Ptr< FrameCaptureModel > m_frameCaptureModel
Frame capture model.
Time GetDurationUpToField(WifiPpduField field, const WifiTxVector &txVector) const
Get the duration of the PPDU up to (but excluding) the given field.
WifiPhyBand
Identifies the PHY band.
virtual Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const =0
void NotifyRxBegin(Ptr< const WifiPsdu > psdu, RxPowerWattPerChannelBand rxPowersW)
Public method used to fire a PhyRxBegin trace.
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...
The PHY layer is sending a packet.
Ptr< WifiPhyStateHelper > m_state
Pointer to WifiPhyStateHelper.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
WifiPpduField GetNextField(WifiPpduField currentField, WifiPreamble preamble) const
Return the field following the provided one.
struct PhyEntity::SnrPer CalculatePayloadSnrPer(Ptr< Event > event, uint16_t channelWidth, WifiSpectrumBand band, uint16_t staId, std::pair< Time, Time > relativeMpduStartStop) const
Calculate the SNIR at the start of the payload and accumulate all SNIR changes in the SNIR vector for...
void ResetReceive(Ptr< Event > event)
Reset PHY at the end of the packet under reception after it has failed the PHY header.
double GetTxPowerForTransmission(Ptr< const WifiPpdu > ppdu) const
Compute the transmit power for the next transmission.
SignalNoiseDbm structure.
void NotifyInterferenceRxEndAndClear(bool reset)
Notify WifiPhy's InterferenceHelper of the end of the reception, clear maps and end of MPDU event...
InterferenceHelper m_interference
the class handling interference computations
double snr
SNR in linear scale.
virtual Time CalculateTxDuration(WifiConstPsduMap psduMap, const WifiTxVector &txVector, WifiPhyBand band) const
The MPDU is the last aggregate in an A-MPDU with multiple MPDUs.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
The PHY layer is receiving a packet.
PhyHeaderSections GetPhyHeaderSections(const WifiTxVector &txVector, Time ppduStart) const
Return a map of PHY header chunk information per PPDU field.
static Time GetPayloadDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, MpduType mpdutype=NORMAL_MPDU, uint16_t staId=SU_STA_ID)
std::vector< Ptr< WifiMacQueueItem > >::const_iterator begin(void) const
Return a const iterator to the first MPDU.
double GetRandomValue(void) const
Obtain a random value from the WifiPhy's generator.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
virtual bool DoStartReceiveField(WifiPpduField field, Ptr< Event > event)
Start receiving a given field, perform amendment-specific actions, and signify if it is supported...
The PHY layer is switched off.
void EndPreambleDetectionPeriod(Ptr< Event > event)
End the preamble detection period.
double GetTxGain(void) const
Return the transmission gain (dB).
The PHY layer is switching to other channel.
double CalculateSnr(Ptr< Event > event, uint16_t channelWidth, uint8_t nss, WifiSpectrumBand band) const
Calculate the SNIR for the event (starting from now until the event end).
void StartReceiveField(WifiPpduField field, Ptr< Event > event)
Start receiving a given field.
virtual void DoResetReceive(Ptr< Event > event)
Perform amendment-specific actions before resetting PHY at the end of the PPDU under reception after ...
void NotifyMonitorSniffRx(Ptr< const WifiPsdu > psdu, uint16_t channelFreqMhz, WifiTxVector txVector, SignalNoiseDbm signalNoise, std::vector< bool > statusPerMpdu, uint16_t staId=SU_STA_ID)
Public method used to fire a MonitorSniffer trace for a wifi PSDU being received. ...
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint16_t GetChannelWidth(void) const
const WifiPhyOperatingChannel & GetOperatingChannel(void) const
Get a const reference to the operating channel.
std::list< WifiMode >::const_iterator end(void) const
Return a const iterator to past-the-last WifiMode.
virtual void CancelAllEvents(void)
Cancel and clear all running events.
struct PhyEntity::SnrPer CalculatePhyHeaderSnrPer(Ptr< Event > event, uint16_t channelWidth, WifiSpectrumBand band, WifiPpduField header) const
Calculate the SNIR at the start of the PHY header and accumulate all SNIR changes in the SNIR vector...
std::map< WifiModulationClass, Ptr< PhyEntity > > m_phyEntities
This map holds the supported PHY entities.
The MPDU is a single MPDU.
Time GetLastRxEndTime(void) const
Return the end time of the last received packet.
void MaybeCcaBusyDuration(uint16_t channelWidth)
Eventually switch to CCA busy.
void CancelRunningEndPreambleDetectionEvents(bool clear=false)
Cancel and eventually clear all end preamble detection events.
Ptr< Event > m_currentEvent
Hold the current event.
virtual bool IsModeSupported(WifiMode mode) const
Check if the WifiMode is supported.
bool IsStateRx(void) const
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Ptr< T > Copy(Ptr< T > object)
Return a deep copy of a Ptr.
double GetRxPowerWForPpdu(Ptr< Event > event) const
Obtain the received power (W) for a given band.
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
void EndReceiveField(WifiPpduField field, Ptr< Event > event)
End receiving a given field.
std::list< WifiMode > m_modeList
the list of supported modes
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
virtual uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const
Return the channel width used to measure the RSSI.
uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const