A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
he-phy.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Orange Labs
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Authors: Rediet <getachew.redieteab@orange.com>
7 * Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and
8 * spectrum-wifi-phy)
9 */
10
11#ifndef HE_PHY_H
12#define HE_PHY_H
13
14#include "he-ppdu.h"
15
16#include "ns3/callback.h"
17#include "ns3/vht-phy.h"
18#include "ns3/wifi-phy-band.h"
19#include "ns3/wifi-types.h"
20
21#include <optional>
22
23/**
24 * \file
25 * \ingroup wifi
26 * Declaration of ns3::HePhy class
27 * and ns3::HeSigAParameters struct.
28 */
29
30namespace ns3
31{
32
33class ObssPdAlgorithm;
34
35/**
36 * This defines the BSS membership value for HE PHY.
37 */
38#define HE_PHY 122
39
40/**
41 * Parameters for received HE-SIG-A for OBSS_PD based SR
42 */
44{
45 dBm_u rssi; ///< RSSI
46 uint8_t bssColor; ///< BSS color
47};
48
49/**
50 * \brief PHY entity for HE (11ax)
51 * \ingroup wifi
52 *
53 * HE PHY is based on VHT PHY.
54 *
55 * Refer to P802.11ax/D4.0, clause 27.
56 */
57class HePhy : public VhtPhy
58{
59 public:
60 /**
61 * Callback upon end of HE-SIG-A
62 *
63 * arg1: Parameters of HE-SIG-A
64 */
66
67 /**
68 * Constructor for HE PHY
69 *
70 * \param buildModeList flag used to add HE modes to list (disabled
71 * by child classes to only add child classes' modes)
72 */
73 HePhy(bool buildModeList = true);
74 /**
75 * Destructor for HE PHY
76 */
77 ~HePhy() override;
78
79 WifiMode GetSigMode(WifiPpduField field, const WifiTxVector& txVector) const override;
80 WifiMode GetSigAMode() const override;
81 WifiMode GetSigBMode(const WifiTxVector& txVector) const override;
82 const PpduFormats& GetPpduFormats() const override;
83 Time GetLSigDuration(WifiPreamble preamble) const override;
85 uint8_t nDataLtf,
86 uint8_t nExtensionLtf = 0) const override;
87 Time GetSigADuration(WifiPreamble preamble) const override;
88 Time GetSigBDuration(const WifiTxVector& txVector) const override;
90 const WifiTxVector& txVector,
91 Time ppduDuration) override;
95 Time rxDuration) override;
96 void CancelAllEvents() override;
97 uint16_t GetStaId(const Ptr<const WifiPpdu> ppdu) const override;
98 MHz_u GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const override;
99 void StartTx(Ptr<const WifiPpdu> ppdu) override;
101 const WifiTxVector& txVector,
102 WifiPhyBand band) const override;
103 void SwitchMaybeToCcaBusy(const Ptr<const WifiPpdu> ppdu) override;
105 WifiChannelListType channelType) const override;
106 void NotifyCcaBusy(const Ptr<const WifiPpdu> ppdu,
107 Time duration,
108 WifiChannelListType channelType) override;
109 bool CanStartRx(Ptr<const WifiPpdu> ppdu) const override;
111
112 /**
113 * \return the BSS color of this PHY.
114 */
115 uint8_t GetBssColor() const;
116
117 /**
118 * Compute the L-SIG length value corresponding to the given HE TB PPDU duration.
119 * If the latter is not a feasible duration (considering the selected guard interval),
120 * a proper duration is computed and returned along with the L-SIG length value.
121 *
122 * \param ppduDuration the duration of the HE TB PPDU
123 * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
124 * \param band the frequency band being used
125 *
126 * \return the L-SIG length value and the adjusted HE TB PPDU duration.
127 */
128 static std::pair<uint16_t, Time> ConvertHeTbPpduDurationToLSigLength(
129 Time ppduDuration,
130 const WifiTxVector& txVector,
131 WifiPhyBand band);
132 /**
133 * \param length the L-SIG length value
134 * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
135 * \param band the frequency band being used
136 *
137 * \return the duration of the HE TB PPDU corresponding to that L-SIG length value.
138 */
139 static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length,
140 const WifiTxVector& txVector,
141 WifiPhyBand band);
142 /**
143 * \param txVector the transmission parameters used for the HE TB PPDU
144 *
145 * \return the duration of the non-HE portion of the HE TB PPDU.
146 */
147 virtual Time CalculateNonHeDurationForHeTb(const WifiTxVector& txVector) const;
148
149 /**
150 * \param txVector the transmission parameters used for the HE MU PPDU
151 *
152 * \return the duration of the non-HE portion of the HE MU PPDU.
153 */
154 virtual Time CalculateNonHeDurationForHeMu(const WifiTxVector& txVector) const;
155
156 /**
157 * Get the band in the TX spectrum associated with the RU used by the PSDU
158 * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
159 *
160 * \param txVector the TXVECTOR used for the transmission
161 * \param staId the STA-ID of the station
162 *
163 * \return the RU band in the TX spectrum
164 */
165 WifiSpectrumBandInfo GetRuBandForTx(const WifiTxVector& txVector, uint16_t staId) const;
166 /**
167 * Get the band in the RX spectrum associated with the RU used by the PSDU
168 * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
169 *
170 * \param txVector the TXVECTOR used for the transmission
171 * \param staId the STA-ID of the station
172 *
173 * \return the RU band in the RX spectrum
174 */
175 WifiSpectrumBandInfo GetRuBandForRx(const WifiTxVector& txVector, uint16_t staId) const;
176 /**
177 * Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
178 *
179 * \param txVector the TXVECTOR used for the transmission
180 * \param staId the STA-ID of the station taking part of the UL MU
181 *
182 * \return the spectrum band used to transmit the non-OFDMA part of an HE TB PPDU
183 */
184 WifiSpectrumBandInfo GetNonOfdmaBand(const WifiTxVector& txVector, uint16_t staId) const;
185 /**
186 * Get the width of the non-OFDMA portion of an HE TB PPDU
187 *
188 * \param ru the RU in which the HE TB PPDU is sent
189 * \return the width of the non-OFDMA portion of an HE TB PPDU
190 */
192
193 /**
194 * \return the UID of the HE TB PPDU being received
195 */
196 uint64_t GetCurrentHeTbPpduUid() const;
197
198 /**
199 * Set the TRIGVECTOR and the associated expiration time. A TRIGVECTOR shall expire
200 * when the TX timer associated with the transmission of the Trigger Frame expires.
201 *
202 * \param trigVector the TRIGVECTOR
203 * \param validity the amount of time (from now) until expiration of the TRIGVECTOR
204 */
205 void SetTrigVector(const WifiTxVector& trigVector, Time validity);
206
207 /**
208 * Get the center frequency per segment of the non-HE portion of the current PPDU for the given
209 * STA-ID. Note this method is only to be used for UL MU.
210 *
211 * \param ppdu the PPDU
212 * \param staId the STA-ID of the station taking part of the UL MU
213 * \return the center frequency corresponding to the non-HE portion of the HE TB PPDU
214 */
215 std::vector<MHz_u> GetCenterFrequenciesForNonHePart(const Ptr<const WifiPpdu> ppdu,
216 uint16_t staId) const;
217
218 /**
219 * Sets the OBSS-PD algorithm.
220 *
221 * \param algorithm the OBSS-PD algorithm
222 */
223 void SetObssPdAlgorithm(const Ptr<ObssPdAlgorithm> algorithm);
224
225 /**
226 * Gets the OBSS-PD algorithm.
227 *
228 * \return the OBSS-PD algorithm
229 */
231
232 /**
233 * Set a callback for a end of HE-SIG-A.
234 *
235 * \param callback the EndOfHeSigACallback to set
236 */
238
239 /**
240 * Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
241 * This method is scheduled immediately after end of HE-SIG-A, once
242 * field processing is finished.
243 *
244 * \param params the HE-SIG-A parameters
245 */
247
248 /**
249 * Initialize all HE modes.
250 */
251 static void InitializeModes();
252 /**
253 * Return the HE MCS corresponding to
254 * the provided index.
255 *
256 * \param index the index of the MCS
257 * \return an HE MCS
258 */
259 static WifiMode GetHeMcs(uint8_t index);
260
261 /**
262 * Return MCS 0 from HE MCS values.
263 *
264 * \return MCS 0 from HE MCS values
265 */
267 /**
268 * Return MCS 1 from HE MCS values.
269 *
270 * \return MCS 1 from HE MCS values
271 */
273 /**
274 * Return MCS 2 from HE MCS values.
275 *
276 * \return MCS 2 from HE MCS values
277 */
279 /**
280 * Return MCS 3 from HE MCS values.
281 *
282 * \return MCS 3 from HE MCS values
283 */
285 /**
286 * Return MCS 4 from HE MCS values.
287 *
288 * \return MCS 4 from HE MCS values
289 */
291 /**
292 * Return MCS 5 from HE MCS values.
293 *
294 * \return MCS 5 from HE MCS values
295 */
297 /**
298 * Return MCS 6 from HE MCS values.
299 *
300 * \return MCS 6 from HE MCS values
301 */
303 /**
304 * Return MCS 7 from HE MCS values.
305 *
306 * \return MCS 7 from HE MCS values
307 */
309 /**
310 * Return MCS 8 from HE MCS values.
311 *
312 * \return MCS 8 from HE MCS values
313 */
315 /**
316 * Return MCS 9 from HE MCS values.
317 *
318 * \return MCS 9 from HE MCS values
319 */
321 /**
322 * Return MCS 10 from HE MCS values.
323 *
324 * \return MCS 10 from HE MCS values
325 */
327 /**
328 * Return MCS 11 from HE MCS values.
329 *
330 * \return MCS 11 from HE MCS values
331 */
333
334 /**
335 * Return the coding rate corresponding to
336 * the supplied HE MCS index. This function is used
337 * as a callback for WifiMode operation.
338 *
339 * \param mcsValue the MCS index
340 * \return the coding rate.
341 */
342 static WifiCodeRate GetCodeRate(uint8_t mcsValue);
343 /**
344 * Return the constellation size corresponding
345 * to the supplied HE MCS index. This function is used
346 * as a callback for WifiMode operation.
347 *
348 * \param mcsValue the MCS index
349 * \return the size of modulation constellation.
350 */
351 static uint16_t GetConstellationSize(uint8_t mcsValue);
352 /**
353 * Return the PHY rate corresponding to the supplied HE MCS
354 * index, channel width, guard interval, and number of
355 * spatial stream. This function calls HtPhy::CalculatePhyRate
356 * and is mainly used as a callback for WifiMode operation.
357 *
358 * \param mcsValue the HE MCS index
359 * \param channelWidth the considered channel width
360 * \param guardInterval the considered guard interval duration
361 * \param nss the considered number of stream
362 *
363 * \return the physical bit rate of this signal in bps.
364 */
365 static uint64_t GetPhyRate(uint8_t mcsValue,
366 MHz_u channelWidth,
367 Time guardInterval,
368 uint8_t nss);
369 /**
370 * Return the PHY rate corresponding to
371 * the supplied TXVECTOR for the STA-ID.
372 *
373 * \param txVector the TXVECTOR used for the transmission
374 * \param staId the station ID for MU (unused if SU)
375 * \return the physical bit rate of this signal in bps.
376 */
377 static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector,
378 uint16_t staId = SU_STA_ID);
379 /**
380 * Return the data rate corresponding to
381 * the supplied TXVECTOR for the STA-ID.
382 *
383 * \param txVector the TXVECTOR used for the transmission
384 * \param staId the station ID for MU (unused if SU)
385 * \return the data bit rate in bps.
386 */
387 static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector,
388 uint16_t staId = SU_STA_ID);
389 /**
390 * Return the data rate corresponding to
391 * the supplied HE MCS index, channel width,
392 * guard interval, and number of spatial
393 * streams.
394 *
395 * \param mcsValue the MCS index
396 * \param channelWidth the channel width
397 * \param guardInterval the guard interval duration
398 * \param nss the number of spatial streams
399 * \return the data bit rate in bps.
400 */
401 static uint64_t GetDataRate(uint8_t mcsValue,
402 MHz_u channelWidth,
403 Time guardInterval,
404 uint8_t nss);
405 /**
406 * Calculate the rate in bps of the non-HT Reference Rate corresponding
407 * to the supplied HE MCS index. This function calls CalculateNonHtReferenceRate
408 * and is used as a callback for WifiMode operation.
409 *
410 * \param mcsValue the HE MCS index
411 * \return the rate in bps of the non-HT Reference Rate.
412 */
413 static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
414 /**
415 * Check whether the combination in TXVECTOR is allowed.
416 * This function is used as a callback for WifiMode operation.
417 *
418 * \param txVector the TXVECTOR
419 * \returns true if this combination is allowed, false otherwise.
420 */
421 static bool IsAllowed(const WifiTxVector& txVector);
422
423 /**
424 * Create and return the HE MCS corresponding to
425 * the provided index.
426 * This method binds all the callbacks used by WifiMode.
427 *
428 * \param index the index of the MCS
429 * \return an HE MCS
430 */
431 static WifiMode CreateHeMcs(uint8_t index);
432
433 /**
434 * \param guardInterval the guard interval duration
435 * \return the symbol duration
436 */
437 static Time GetSymbolDuration(Time guardInterval);
438
439 /**
440 * \param bandWidth the width of the band used for the OFDMA transmission. Must be a multiple of
441 * 20 MHz
442 * \param guardBandwidth width of the guard band
443 * \param centerFrequencies the center frequency of each segment
444 * \param totalWidth the width of the operating channel
445 * \param subcarrierSpacing the subcarrier spacing
446 * \param subcarrierRange the subcarrier range of the HE RU
447 * \param bandIndex the index (starting at 0) of the band within the operating channel
448 * \return the converted subcarriers
449 *
450 * This is a helper function to convert HE RU subcarriers, which are relative to the center
451 * frequency subcarrier, to the indexes used by the Spectrum model. The size of the returned
452 * vector corresponds to the number of segments covered by the HE RU.
453 */
454 static std::vector<WifiSpectrumBandIndices> ConvertHeRuSubcarriers(
455 MHz_u bandWidth,
456 MHz_u guardBandwidth,
457 const std::vector<MHz_u>& centerFrequencies,
458 MHz_u totalWidth,
459 Hz_u subcarrierSpacing,
460 HeRu::SubcarrierRange subcarrierRange,
461 uint8_t bandIndex = 0);
462
463 protected:
465 PhyFieldRxStatus status,
466 WifiPpduField field) override;
468 bool IsConfigSupported(Ptr<const WifiPpdu> ppdu) const override;
469 Time DoStartReceivePayload(Ptr<Event> event) override;
470 std::pair<MHz_u, WifiSpectrumBandInfo> GetChannelWidthAndBand(const WifiTxVector& txVector,
471 uint16_t staId) const override;
473 RxSignalInfo rxSignalInfo,
474 const WifiTxVector& txVector,
475 uint16_t staId,
476 const std::vector<bool>& statusPerMpdu) override;
478 double snr,
479 const WifiTxVector& txVector) override;
480 void DoEndReceivePayload(Ptr<const WifiPpdu> ppdu) override;
481 void DoResetReceive(Ptr<Event> event) override;
483 uint64_t ObtainNextUid(const WifiTxVector& txVector) override;
484 Time GetMaxDelayPpduSameUid(const WifiTxVector& txVector) override;
486 Ptr<const WifiPpdu> ppdu) const override;
487 uint32_t GetMaxPsduSize() const override;
489 const WifiTxVector& txVector) const override;
492 RxPowerWattPerChannelBand& rxPower) override;
493
494 /**
495 * Process SIG-A, perform amendment-specific actions, and
496 * provide an updated status of the reception.
497 *
498 * \param event the event holding incoming PPDU's information
499 * \param status the status of the reception of the correctly received SIG-A after the
500 * configuration support check
501 * \return the updated status of the reception of the SIG-A
502 */
504
505 /**
506 * Process SIG-B, perform amendment-specific actions, and
507 * provide an updated status of the reception.
508 *
509 * \param event the event holding incoming PPDU's information
510 * \param status the status of the reception of the correctly received SIG-A after the
511 * configuration support check
512 * \return the updated status of the reception of the SIG-B
513 */
515
516 /**
517 * \param txVector the transmission parameters
518 * \return the number of bits of the HE-SIG-B
519 */
520 virtual uint32_t GetSigBSize(const WifiTxVector& txVector) const;
521
522 /**
523 * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived) of an MU
524 * transmission. This function is called upon the RX event corresponding to the HE portion of
525 * the MU PPDU.
526 *
527 * \param event the event holding incoming HE portion of the PPDU's information
528 */
530
531 /**
532 * Return the rate (in bps) of the non-HT Reference Rate
533 * which corresponds to the supplied code rate and
534 * constellation size.
535 *
536 * \param codeRate the convolutional coding rate
537 * \param constellationSize the size of modulation constellation
538 * \returns the rate in bps.
539 *
540 * To convert an HE MCS to its corresponding non-HT Reference Rate
541 * use the modulation and coding rate of the HT MCS
542 * and lookup in Table 10-10 of IEEE P802.11ax/D6.0.
543 */
544 static uint64_t CalculateNonHtReferenceRate(WifiCodeRate codeRate, uint16_t constellationSize);
545
546 /**
547 * \param channelWidth the channel width
548 * \return the number of usable subcarriers for data
549 */
550 static uint16_t GetUsableSubcarriers(MHz_u channelWidth);
551
552 uint64_t m_previouslyTxPpduUid; //!< UID of the previously sent PPDU, used by AP to recognize
553 //!< response HE TB PPDUs
554 uint64_t m_currentMuPpduUid; //!< UID of the HE MU or HE TB PPDU being received
555
556 std::map<uint16_t /* STA-ID */, EventId>
557 m_beginMuPayloadRxEvents; //!< the beginning of the MU payload reception events (indexed by
558 //!< STA-ID)
559
560 EndOfHeSigACallback m_endOfHeSigACallback; //!< end of HE-SIG-A callback
561 std::optional<WifiTxVector> m_trigVector; //!< the TRIGVECTOR
562 std::optional<Time> m_trigVectorExpirationTime; //!< expiration time of the TRIGVECTOR
563 std::optional<WifiTxVector> m_currentTxVector; //!< If the STA is an AP STA, this holds the
564 //!< TXVECTOR of the PPDU that has been sent
565
566 private:
567 void BuildModeList() override;
568 uint8_t GetNumberBccEncoders(const WifiTxVector& txVector) const override;
569 Time GetSymbolDuration(const WifiTxVector& txVector) const override;
570
571 /**
572 * This is a helper function to create the TX PSD of the non-HE and HE portions.
573 *
574 * \param txPower power to spread across the bands
575 * \param ppdu the PPDU that will be transmitted
576 * \param flag flag indicating whether the PSD is for non-HE portion or HE portion
577 * \return Pointer to SpectrumValue
578 */
581 HePpdu::TxPsdFlag flag) const;
582
583 /**
584 * Start the transmission of the HE portion of the MU PPDU.
585 *
586 * \param ppdu the PPDU
587 * \param txPower the total TX power
588 * \param txPowerSpectrum the TX PSD
589 * \param hePortionDuration the duration of the HE portion
590 */
592 dBm_u txPower,
593 Ptr<SpectrumValue> txPowerSpectrum,
594 Time hePortionDuration);
595
596 /**
597 * Notify PHY state helper to switch to CCA busy state,
598 *
599 * \param duration the duration of the CCA state
600 * \param channelType the channel type for which the CCA busy state is reported.
601 * \param per20MHzDurations the per-20 MHz CCA durations vector
602 */
603 void NotifyCcaBusy(Time duration,
604 WifiChannelListType channelType,
605 const std::vector<Time>& per20MHzDurations);
606
607 /**
608 * Compute the per-20 MHz CCA durations vector that indicates
609 * for how long each 20 MHz subchannel (corresponding to the
610 * index of the element in the vector) is busy and where a zero duration
611 * indicates that the subchannel is idle. The vector is non-empty if the
612 * operational channel width is larger than 20 MHz.
613 *
614 * \param ppdu the incoming PPDU or nullptr for any signal
615 * \return the per-20 MHz CCA durations vector
616 */
617 std::vector<Time> GetPer20MHzDurations(const Ptr<const WifiPpdu> ppdu);
618
619 /**
620 * Given a PPDU duration value, the TXVECTOR used to transmit the PPDU and
621 * the PHY band, compute a valid PPDU duration considering the number and
622 * duration of symbols, the preamble duration and the guard interval.
623 *
624 * \param ppduDuration the given PPDU duration
625 * \param txVector the given TXVECTOR
626 * \param band the PHY band
627 * \return a valid PPDU duration
628 */
629 static Time GetValidPpduDuration(Time ppduDuration,
630 const WifiTxVector& txVector,
631 WifiPhyBand band);
632
633 static const PpduFormats m_hePpduFormats; //!< HE PPDU formats
634
635 std::size_t m_rxHeTbPpdus; //!< Number of successfully received HE TB PPDUS
637 std::vector<Time> m_lastPer20MHzDurations; //!< Hold the last per-20 MHz CCA durations vector
638}; // class HePhy
639
640} // namespace ns3
641
642#endif /* HE_PHY_H */
Callback template class.
Definition callback.h:422
An identifier for simulation events.
Definition event-id.h:45
PHY entity for HE (11ax)
Definition he-phy.h:58
std::optional< WifiTxVector > m_trigVector
the TRIGVECTOR
Definition he-phy.h:561
Time GetLSigDuration(WifiPreamble preamble) const override
Definition he-phy.cc:177
virtual Time CalculateNonHeDurationForHeTb(const WifiTxVector &txVector) const
Definition he-phy.cc:294
static uint64_t GetDataRate(uint8_t mcsValue, MHz_u channelWidth, Time guardInterval, uint8_t nss)
Return the data rate corresponding to the supplied HE MCS index, channel width, guard interval,...
Definition he-phy.cc:1701
static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length, const WifiTxVector &txVector, WifiPhyBand band)
Definition he-phy.cc:280
static WifiMode GetHeMcs8()
Return MCS 8 from HE MCS values.
static uint64_t GetPhyRate(uint8_t mcsValue, MHz_u channelWidth, Time guardInterval, uint8_t nss)
Return the PHY rate corresponding to the supplied HE MCS index, channel width, guard interval,...
Definition he-phy.cc:1665
uint64_t GetCurrentHeTbPpduUid() const
Definition he-phy.cc:1089
Ptr< Event > DoGetEvent(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW) override
Get the event corresponding to the incoming PPDU.
Definition he-phy.cc:450
void CancelAllEvents() override
Cancel and clear all running events.
Definition he-phy.cc:405
void SetObssPdAlgorithm(const Ptr< ObssPdAlgorithm > algorithm)
Sets the OBSS-PD algorithm.
Definition he-phy.cc:694
static void InitializeModes()
Initialize all HE modes.
Definition he-phy.cc:1564
static WifiMode GetHeMcs9()
Return MCS 9 from HE MCS values.
void DoAbortCurrentReception(WifiPhyRxfailureReason reason) override
Perform amendment-specific actions before aborting the current reception.
Definition he-phy.cc:417
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...
Definition he-phy.cc:1009
void StartReceiveMuPayload(Ptr< Event > event)
Start receiving the PSDU (i.e.
Definition he-phy.cc:924
static WifiMode GetHeMcs11()
Return MCS 11 from HE MCS values.
virtual PhyFieldRxStatus ProcessSigB(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-B, perform amendment-specific actions, and provide an updated status of the reception.
Definition he-phy.cc:721
virtual Time CalculateNonHeDurationForHeMu(const WifiTxVector &txVector) const
Definition he-phy.cc:303
std::optional< WifiTxVector > m_currentTxVector
If the STA is an AP STA, this holds the TXVECTOR of the PPDU that has been sent.
Definition he-phy.h:563
Time GetSigBDuration(const WifiTxVector &txVector) const override
Definition he-phy.cc:228
static WifiMode CreateHeMcs(uint8_t index)
Create and return the HE MCS corresponding to the provided index.
Definition he-phy.cc:1622
virtual uint32_t GetSigBSize(const WifiTxVector &txVector) const
Definition he-phy.cc:212
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
Definition he-phy.cc:1573
static WifiMode GetHeMcs0()
Return MCS 0 from HE MCS values.
void BuildModeList() override
Build mode list.
Definition he-phy.cc:96
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.
Definition he-phy.cc:1780
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...
Definition he-phy.cc:1751
void StartTxHePortion(Ptr< const WifiPpdu > ppdu, dBm_u txPower, Ptr< SpectrumValue > txPowerSpectrum, Time hePortionDuration)
Start the transmission of the HE portion of the MU PPDU.
Definition he-phy.cc:1517
bool CanStartRx(Ptr< const WifiPpdu > ppdu) const override
Determine whether the PHY shall issue a PHY-RXSTART.indication primitive in response to a given PPDU.
Definition he-phy.cc:1800
void SetEndOfHeSigACallback(EndOfHeSigACallback callback)
Set a callback for a end of HE-SIG-A.
Definition he-phy.cc:706
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
Definition he-phy.h:552
static WifiCodeRate GetCodeRate(uint8_t mcsValue)
Return the coding rate corresponding to the supplied HE MCS index.
Definition he-phy.cc:1638
static WifiMode GetHeMcs6()
Return MCS 6 from HE MCS values.
void StartTx(Ptr< const WifiPpdu > ppdu) override
This function is called by SpectrumWifiPhy to send the PPDU while performing amendment-specific actio...
Definition he-phy.cc:1466
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...
Definition he-phy.cc:583
EndOfHeSigACallback m_endOfHeSigACallback
end of HE-SIG-A callback
Definition he-phy.h:560
static WifiMode GetHeMcs4()
Return MCS 4 from HE MCS values.
Ptr< const WifiPsdu > GetAddressedPsduInPpdu(Ptr< const WifiPpdu > ppdu) const override
Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
Definition he-phy.cc:538
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
Definition he-phy.cc:109
const PpduFormats & GetPpduFormats() const override
Return the PPDU formats of the PHY.
Definition he-phy.cc:171
uint64_t ObtainNextUid(const WifiTxVector &txVector) override
Obtain the next UID for the PPDU to transmit.
Definition he-phy.cc:1289
Time CalculateTxDuration(const WifiConstPsduMap &psduMap, const WifiTxVector &txVector, WifiPhyBand band) const override
Definition he-phy.cc:1530
static WifiMode GetHeMcs10()
Return MCS 10 from HE MCS values.
Callback< void, HeSigAParameters > EndOfHeSigACallback
Callback upon end of HE-SIG-A.
Definition he-phy.h:65
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.
Definition he-phy.cc:1673
Ptr< ObssPdAlgorithm > m_obssPdAlgorithm
OBSS-PD algorithm.
Definition he-phy.h:636
dBm_u GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const override
Return the CCA threshold for a given channel type.
Definition he-phy.cc:1113
std::pair< MHz_u, WifiSpectrumBandInfo > GetChannelWidthAndBand(const WifiTxVector &txVector, uint16_t staId) const override
Get the channel width and band to use (will be overloaded by child classes).
Definition he-phy.cc:965
MHz_u GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
Definition he-phy.cc:1095
Ptr< ObssPdAlgorithm > GetObssPdAlgorithm() const
Gets the OBSS-PD algorithm.
Definition he-phy.cc:700
uint8_t GetBssColor() const
Definition he-phy.cc:550
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,...
Definition he-phy.cc:248
uint8_t GetNumberBccEncoders(const WifiTxVector &txVector) const override
Definition he-phy.cc:313
Time GetMaxDelayPpduSameUid(const WifiTxVector &txVector) override
Obtain the maximum time between two PPDUs with the same UID to consider they are identical and their ...
Definition he-phy.cc:1309
void HandleRxPpduWithSameContent(Ptr< Event > event, Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPower) override
Handle reception of a PPDU that carries the same content of another PPDU.
Definition he-phy.cc:516
static bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
Definition he-phy.cc:1774
std::size_t m_rxHeTbPpdus
Number of successfully received HE TB PPDUS.
Definition he-phy.h:635
static std::vector< WifiSpectrumBandIndices > ConvertHeRuSubcarriers(MHz_u bandWidth, MHz_u guardBandwidth, const std::vector< MHz_u > &centerFrequencies, MHz_u totalWidth, Hz_u subcarrierSpacing, HeRu::SubcarrierRange subcarrierRange, uint8_t bandIndex=0)
Definition he-phy.cc:1845
~HePhy() override
Destructor for HE PHY.
Definition he-phy.cc:90
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Definition he-phy.cc:343
void NotifyEndOfHeSigA(HeSigAParameters params)
Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
Definition he-phy.cc:712
Ptr< SpectrumValue > GetTxPowerSpectralDensity(Watt_u txPower, Ptr< const WifiPpdu > ppdu) const override
Definition he-phy.cc:1328
static WifiMode GetHeMcs7()
Return MCS 7 from HE MCS values.
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.
Definition he-phy.cc:852
uint64_t m_currentMuPpduUid
UID of the HE MU or HE TB PPDU being received.
Definition he-phy.h:554
static WifiMode GetHeMcs3()
Return MCS 3 from HE MCS values.
uint32_t GetMaxPsduSize() const override
Get the maximum PSDU size in bytes.
Definition he-phy.cc:1794
static const PpduFormats m_hePpduFormats
HE PPDU formats.
Definition he-phy.h:633
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.
Definition he-phy.cc:1687
std::map< uint16_t, EventId > m_beginMuPayloadRxEvents
the beginning of the MU payload reception events (indexed by STA-ID)
Definition he-phy.h:557
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...
Definition he-phy.cc:1191
void RxPayloadFailed(Ptr< const WifiPsdu > psdu, double snr, const WifiTxVector &txVector) override
Perform amendment-specific actions when the payload is unsuccessfuly received.
Definition he-phy.cc:870
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.
Definition he-phy.cc:1819
HePhy(bool buildModeList=true)
Constructor for HE PHY.
Definition he-phy.cc:70
bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const override
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
Definition he-phy.cc:743
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.
Definition he-phy.cc:565
static Time GetSymbolDuration(Time guardInterval)
Definition he-phy.cc:1737
void SetTrigVector(const WifiTxVector &trigVector, Time validity)
Set the TRIGVECTOR and the associated expiration time.
Definition he-phy.cc:328
static WifiMode GetHeMcs1()
Return MCS 1 from HE MCS values.
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.
Definition he-phy.cc:261
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.
Definition he-phy.cc:1743
WifiMode GetSigBMode(const WifiTxVector &txVector) const override
Definition he-phy.cc:138
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.
Definition he-phy.cc:1143
Time DoStartReceivePayload(Ptr< Event > event) override
Start receiving the PSDU (i.e.
Definition he-phy.cc:782
void StartReceivePreamble(Ptr< const WifiPpdu > ppdu, RxPowerWattPerChannelBand &rxPowersW, Time rxDuration) override
Start receiving the PHY preamble of a PPDU (i.e.
Definition he-phy.cc:355
virtual PhyFieldRxStatus ProcessSigA(Ptr< Event > event, PhyFieldRxStatus status)
Process SIG-A, perform amendment-specific actions, and provide an updated status of the reception.
Definition he-phy.cc:600
std::optional< Time > m_trigVectorExpirationTime
expiration time of the TRIGVECTOR
Definition he-phy.h:562
void DoEndReceivePayload(Ptr< const WifiPpdu > ppdu) override
Perform amendment-specific actions at the end of the reception of the payload.
Definition he-phy.cc:880
static WifiMode GetHeMcs5()
Return MCS 5 from HE MCS values.
void DoResetReceive(Ptr< Event > event) override
Perform amendment-specific actions before resetting PHY at the end of the PPDU under reception after ...
Definition he-phy.cc:435
static WifiMode GetHeMcs2()
Return MCS 2 from HE MCS values.
WifiMode GetSigAMode() const override
Definition he-phy.cc:132
std::vector< MHz_u > GetCenterFrequenciesForNonHePart(const Ptr< const WifiPpdu > ppdu, uint16_t staId) const
Get the center frequency per segment of the non-HE portion of the current PPDU for the given STA-ID.
Definition he-phy.cc:1437
Time GetSigADuration(WifiPreamble preamble) const override
Definition he-phy.cc:204
WifiSpectrumBandInfo GetNonOfdmaBand(const WifiTxVector &txVector, uint16_t staId) const
Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
Definition he-phy.cc:1040
MHz_u GetNonOfdmaWidth(HeRu::RuSpec ru) const
Get the width of the non-OFDMA portion of an HE TB PPDU.
Definition he-phy.cc:1077
Time GetTrainingDuration(const WifiTxVector &txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const override
Definition he-phy.cc:183
std::vector< Time > m_lastPer20MHzDurations
Hold the last per-20 MHz CCA durations vector.
Definition he-phy.h:637
void NotifyCcaBusy(const Ptr< const WifiPpdu > ppdu, Time duration, WifiChannelListType channelType) override
Notify PHY state helper to switch to CCA busy state,.
Definition he-phy.cc:1172
static uint16_t GetConstellationSize(uint8_t mcsValue)
Return the constellation size corresponding to the supplied HE MCS index.
Definition he-phy.cc:1652
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...
Definition he-phy.cc:979
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSDs for pre-HE and HE porti...
Definition he-ppdu.h:104
RU Specification.
Definition he-ru.h:57
std::pair< int16_t, int16_t > SubcarrierRange
(lowest index, highest index) pair defining a subcarrier range
Definition he-ru.h:43
static uint16_t GetUsableSubcarriers()
Definition ofdm-phy.cc:624
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
Definition phy-entity.h:529
Smart pointer class similar to boost::intrusive_ptr.
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
PHY entity for VHT (11ac)
Definition vht-phy.h:38
represent a single transmission mode
Definition wifi-mode.h:40
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
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)
Declaration of ns3::HePpdu class.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
std::map< WifiSpectrumBandInfo, Watt_u > RxPowerWattPerChannelBand
A map of the received power for each band.
Definition phy-entity.h:45
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
Definition wifi-mode.h:24
WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
Parameters for received HE-SIG-A for OBSS_PD based SR.
Definition he-phy.h:44
uint8_t bssColor
BSS color.
Definition he-phy.h:46
dBm_u rssi
RSSI.
Definition he-phy.h:45
Status of the reception of the PPDU field.
Definition phy-entity.h:80
RxSignalInfo structure containing info on the received signal.
Definition wifi-types.h:72
WifiSpectrumBandInfo structure containing info about a spectrum band.