A Discrete-Event Network Simulator
API
wifi-phy-common.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005,2006,2007 INRIA
3  * Copyright (c) 2020 Orange Labs
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  * Rediet <getachew.redieteab@orange.com>
20  */
21 
22 #ifndef WIFI_PHY_COMMON_H
23 #define WIFI_PHY_COMMON_H
24 
25 #include "wifi-standards.h"
26 
27 #include "ns3/fatal-error.h"
28 #include "ns3/ptr.h"
29 #include "ns3/wifi-spectrum-value-helper.h"
30 
31 #include <ostream>
32 
44 namespace ns3
45 {
46 
47 class WifiNetDevice;
48 class WifiMode;
49 class Time;
50 
52 static constexpr uint8_t MAX_PROPAGATION_DELAY_USEC = 1;
53 
57 using WifiSpectrumBandFrequencies = std::pair<uint64_t, uint64_t>;
58 
61 {
64 };
65 
67 using WifiSpectrumBands = std::vector<WifiSpectrumBandInfo>;
68 
78 inline bool
80 {
81  return lhs.frequencies < rhs.frequencies;
82 }
83 
91 inline std::ostream&
92 operator<<(std::ostream& os, const WifiSpectrumBandInfo& band)
93 {
94  os << "indices: [" << band.indices.first << "-" << band.indices.second << "], frequencies: ["
95  << band.frequencies.first << "Hz-" << band.frequencies.second << "Hz]";
96  return os;
97 }
98 
106 enum WifiCodeRate : uint16_t
107 {
121 };
122 
130 inline std::ostream&
131 operator<<(std::ostream& os, const WifiCodeRate& codeRate)
132 {
133  switch (codeRate)
134  {
136  return (os << "Code rate undefined");
137  case WIFI_CODE_RATE_1_2:
138  return (os << "Code rate 1/2");
139  case WIFI_CODE_RATE_2_3:
140  return (os << "Code rate 2/3");
141  case WIFI_CODE_RATE_3_4:
142  return (os << "Code rate 3/4");
143  case WIFI_CODE_RATE_5_6:
144  return (os << "Code rate 5/6");
145  case WIFI_CODE_RATE_5_8:
146  return (os << "Code rate 5/8");
148  return (os << "Code rate 13/16");
149  case WIFI_CODE_RATE_1_4:
150  return (os << "Code rate 1/4");
152  return (os << "Code rate 13/28");
154  return (os << "Code rate 13/21");
156  return (os << "Code rate 52/63");
158  return (os << "Code rate 13/14");
159  case WIFI_CODE_RATE_7_8:
160  return (os << "Code rate 7/8");
161  default:
162  NS_FATAL_ERROR("Unknown code rate");
163  return (os << "Unknown");
164  }
165 }
166 
172 {
187 };
188 
196 inline std::ostream&
197 operator<<(std::ostream& os, const WifiPreamble& preamble)
198 {
199  switch (preamble)
200  {
201  case WIFI_PREAMBLE_LONG:
202  return (os << "LONG");
203  case WIFI_PREAMBLE_SHORT:
204  return (os << "SHORT");
205  case WIFI_PREAMBLE_HT_MF:
206  return (os << "HT_MF");
208  return (os << "VHT_SU");
210  return (os << "VHT_MU");
212  return (os << "DMG_CTRL");
214  return (os << "DMG_SC");
216  return (os << "DMG_OFDM");
217  case WIFI_PREAMBLE_HE_SU:
218  return (os << "HE_SU");
220  return (os << "HE_ER_SU");
221  case WIFI_PREAMBLE_HE_MU:
222  return (os << "HE_MU");
223  case WIFI_PREAMBLE_HE_TB:
224  return (os << "HE_TB");
226  return (os << "EHT_MU");
228  return (os << "EHT_TB");
229  default:
230  NS_FATAL_ERROR("Invalid preamble");
231  return (os << "INVALID");
232  }
233 }
234 
242 {
258 };
259 
267 inline std::ostream&
268 operator<<(std::ostream& os, const WifiModulationClass& modulation)
269 {
270  switch (modulation)
271  {
272  case WIFI_MOD_CLASS_DSSS:
273  return (os << "DSSS");
275  return (os << "HR/DSSS");
277  return (os << "ERP-OFDM");
278  case WIFI_MOD_CLASS_OFDM:
279  return (os << "OFDM");
280  case WIFI_MOD_CLASS_HT:
281  return (os << "HT");
282  case WIFI_MOD_CLASS_VHT:
283  return (os << "VHT");
285  return (os << "DMG_CTRL");
287  return (os << "DMG_OFDM");
289  return (os << "DMG_SC");
291  return (os << "DMG_LP_SC");
292  case WIFI_MOD_CLASS_HE:
293  return (os << "HE");
294  case WIFI_MOD_CLASS_EHT:
295  return (os << "EHT");
296  default:
297  NS_FATAL_ERROR("Unknown modulation");
298  return (os << "unknown");
299  }
300 }
301 
307 {
329 };
330 
338 inline std::ostream&
339 operator<<(std::ostream& os, const WifiPpduField& field)
340 {
341  switch (field)
342  {
344  return (os << "preamble");
346  return (os << "non-HT header");
348  return (os << "HT-SIG");
350  return (os << "training");
352  return (os << "SIG-A");
354  return (os << "SIG-B");
356  return (os << "U-SIG");
358  return (os << "EHT-SIG");
360  return (os << "data");
361  default:
362  NS_FATAL_ERROR("Unknown field");
363  return (os << "unknown");
364  }
365 }
366 
372 {
376 };
377 
385 inline std::ostream&
386 operator<<(std::ostream& os, const WifiPpduType& type)
387 {
388  switch (type)
389  {
390  case WIFI_PPDU_TYPE_SU:
391  return (os << "SU");
393  return (os << "DL MU");
395  return (os << "UL MU");
396  default:
397  NS_FATAL_ERROR("Unknown type");
398  return (os << "unknown");
399  }
400 }
401 
407 {
408  UNKNOWN = 0,
432 };
433 
441 inline std::ostream&
442 operator<<(std::ostream& os, const WifiPhyRxfailureReason& reason)
443 {
444  switch (reason)
445  {
447  return (os << "UNSUPPORTED_SETTINGS");
448  case CHANNEL_SWITCHING:
449  return (os << "CHANNEL_SWITCHING");
450  case RXING:
451  return (os << "RXING");
452  case TXING:
453  return (os << "TXING");
454  case SLEEPING:
455  return (os << "SLEEPING");
456  case POWERED_OFF:
457  return (os << "OFF");
458  case TRUNCATED_TX:
459  return (os << "TRUNCATED_TX");
461  return (os << "BUSY_DECODING_PREAMBLE");
463  return (os << "PREAMBLE_DETECT_FAILURE");
465  return (os << "RECEPTION_ABORTED_BY_TX");
466  case L_SIG_FAILURE:
467  return (os << "L_SIG_FAILURE");
468  case HT_SIG_FAILURE:
469  return (os << "HT_SIG_FAILURE");
470  case SIG_A_FAILURE:
471  return (os << "SIG_A_FAILURE");
472  case SIG_B_FAILURE:
473  return (os << "SIG_B_FAILURE");
474  case U_SIG_FAILURE:
475  return (os << "U_SIG_FAILURE");
476  case EHT_SIG_FAILURE:
477  return (os << "EHT_SIG_FAILURE");
479  return (os << "PREAMBLE_DETECTION_PACKET_SWITCH");
481  return (os << "FRAME_CAPTURE_PACKET_SWITCH");
482  case OBSS_PD_CCA_RESET:
483  return (os << "OBSS_PD_CCA_RESET");
484  case PPDU_TOO_LATE:
485  return (os << "PPDU_TOO_LATE");
486  case FILTERED:
487  return (os << "FILTERED");
488  case DMG_HEADER_FAILURE:
489  return (os << "DMG_HEADER_FAILURE");
491  return (os << "DMG_ALLOCATION_ENDED");
492  case UNKNOWN:
493  default:
494  NS_FATAL_ERROR("Unknown reason");
495  return (os << "UNKNOWN");
496  }
497 }
498 
504 enum WifiChannelListType : uint8_t
505 {
510 };
511 
519 inline std::ostream&
520 operator<<(std::ostream& os, WifiChannelListType type)
521 {
522  switch (type)
523  {
525  return (os << "PRIMARY");
527  return (os << "SECONDARY");
529  return (os << "SECONDARY40");
531  return (os << "SECONDARY80");
532  default:
533  NS_FATAL_ERROR("Unknown wifi channel type");
534  return (os << "UNKNOWN");
535  }
536 }
537 
546 uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode, const Ptr<WifiNetDevice> device);
547 
557 uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode,
558  bool htShortGuardInterval,
559  Time heGuardInterval);
560 
569 WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble);
570 
579 
591  WifiModulationClass modClassAnswer);
592 
603 
610 bool IsMu(WifiPreamble preamble);
611 
618 bool IsDlMu(WifiPreamble preamble);
619 
626 bool IsUlMu(WifiPreamble preamble);
627 
635 
642 uint16_t GetMaximumChannelWidth(WifiModulationClass modulation);
643 
650 bool IsEht(WifiPreamble preamble);
651 
652 } // namespace ns3
653 
654 #endif /* WIFI_PHY_COMMON_H */
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
WifiPpduType
The type of PPDU (SU, DL MU, or UL MU)
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802....
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)
@ OBSS_PD_CCA_RESET
@ PREAMBLE_DETECT_FAILURE
@ TRUNCATED_TX
@ FRAME_CAPTURE_PACKET_SWITCH
@ POWERED_OFF
@ UNSUPPORTED_SETTINGS
@ L_SIG_FAILURE
@ DMG_HEADER_FAILURE
@ RECEPTION_ABORTED_BY_TX
@ SIG_A_FAILURE
@ CHANNEL_SWITCHING
@ DMG_ALLOCATION_ENDED
@ U_SIG_FAILURE
@ BUSY_DECODING_PREAMBLE
@ SIG_B_FAILURE
@ HT_SIG_FAILURE
@ PPDU_TOO_LATE
@ EHT_SIG_FAILURE
@ PREAMBLE_DETECTION_PACKET_SWITCH
@ WIFI_PREAMBLE_LONG
@ WIFI_PREAMBLE_EHT_TB
@ WIFI_PREAMBLE_HE_ER_SU
@ WIFI_PREAMBLE_HE_TB
@ WIFI_PREAMBLE_DMG_CTRL
@ WIFI_PREAMBLE_EHT_MU
@ WIFI_PREAMBLE_HE_MU
@ WIFI_PREAMBLE_HE_SU
@ WIFI_PREAMBLE_VHT_MU
@ WIFI_PREAMBLE_VHT_SU
@ WIFI_PREAMBLE_SHORT
@ WIFI_PREAMBLE_HT_MF
@ WIFI_PREAMBLE_DMG_SC
@ WIFI_PREAMBLE_DMG_OFDM
@ WIFI_PPDU_TYPE_DL_MU
@ WIFI_PPDU_TYPE_UL_MU
@ WIFI_PPDU_TYPE_SU
@ WIFI_MOD_CLASS_DMG_OFDM
DMG (Clause 21)
@ WIFI_MOD_CLASS_DMG_CTRL
DMG (Clause 21)
@ WIFI_MOD_CLASS_OFDM
OFDM (Clause 17)
@ WIFI_MOD_CLASS_HR_DSSS
HR/DSSS (Clause 16)
@ WIFI_MOD_CLASS_UNKNOWN
Modulation class unknown or unspecified.
@ WIFI_MOD_CLASS_DMG_SC
DMG (Clause 21)
@ WIFI_MOD_CLASS_HT
HT (Clause 19)
@ WIFI_MOD_CLASS_EHT
EHT (Clause 36)
@ WIFI_MOD_CLASS_VHT
VHT (Clause 22)
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
@ WIFI_MOD_CLASS_DMG_LP_SC
DMG (Clause 21)
@ WIFI_MOD_CLASS_DSSS
DSSS (Clause 15)
@ WIFI_MOD_CLASS_ERP_OFDM
ERP-OFDM (18.4)
@ WIFI_CHANLIST_PRIMARY
@ WIFI_CHANLIST_SECONDARY40
@ WIFI_CHANLIST_SECONDARY
@ WIFI_CHANLIST_SECONDARY80
@ 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_EHT_SIG
EHT-SIG field.
@ WIFI_PPDU_FIELD_HT_SIG
HT-SIG field.
@ WIFI_PPDU_FIELD_PREAMBLE
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP,...
@ WIFI_PPDU_FIELD_U_SIG
U-SIG field.
@ WIFI_PPDU_FIELD_DATA
data field
@ WIFI_PPDU_FIELD_SIG_A
SIG-A field.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Definition: nstime.h:839
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Time GetPpduMaxTime(WifiPreamble preamble)
Get the maximum PPDU duration (see Section 10.14 of 802.11-2016) for the PHY layers defining the aPPD...
uint16_t GetMaximumChannelWidth(WifiModulationClass modulation)
Get the maximum channel width in MHz allowed for the given modulation class.
std::pair< uint64_t, uint64_t > WifiSpectrumBandFrequencies
typedef for a pair of start and stop frequencies in Hz to represent a band
bool IsEht(WifiPreamble preamble)
Return true if a preamble corresponds to an EHT transmission.
bool IsAllowedControlAnswerModulationClass(WifiModulationClass modClassReq, WifiModulationClass modClassAnswer)
Return whether the modulation class of the selected mode for the control answer frame is allowed.
bool IsMu(WifiPreamble preamble)
Return true if a preamble corresponds to a multi-user transmission.
std::vector< WifiSpectrumBandInfo > WifiSpectrumBands
vector of spectrum bands
std::pair< uint32_t, uint32_t > WifiSpectrumBandIndices
typedef for a pair of start and stop sub-band indices
WifiModulationClass GetModulationClassForPreamble(WifiPreamble preamble)
Return the modulation class corresponding to the given preamble type.
bool operator<(const EventId &a, const EventId &b)
Definition: event-id.h:170
uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode, const Ptr< WifiNetDevice > device)
Convert the guard interval to nanoseconds based on the WifiMode.
WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble)
Return the preamble to be used for the transmission.
WifiModulationClass GetModulationClassForStandard(WifiStandard standard)
Return the modulation class corresponding to a given standard.
bool IsDlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a downlink multi-user transmission.
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:159
static constexpr uint8_t MAX_PROPAGATION_DELAY_USEC
maximum propagation delay
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_2_3
2/3 coding rate
@ WIFI_CODE_RATE_13_21
13/21 coding rate
@ WIFI_CODE_RATE_1_2
1/2 coding rate
@ WIFI_CODE_RATE_3_4
3/4 coding rate
@ WIFI_CODE_RATE_1_4
1/4 coding rate
@ WIFI_CODE_RATE_UNDEFINED
undefined coding rate
@ WIFI_CODE_RATE_7_8
7/8 coding rate
@ WIFI_CODE_RATE_52_63
52/63 coding rate
@ WIFI_CODE_RATE_13_14
13/14 coding rate
@ WIFI_CODE_RATE_13_28
13/28 coding rate
@ WIFI_CODE_RATE_5_6
5/6 coding rate
@ WIFI_CODE_RATE_5_8
5/8 coding rate
@ WIFI_CODE_RATE_13_16
13/16 coding rate
WifiSpectrumBandInfo structure containing info about a spectrum band.
WifiSpectrumBandFrequencies frequencies
the start and stop frequencies of the band
WifiSpectrumBandIndices indices
the start and stop indices of the band