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 
30 #include <ostream>
31 
43 namespace ns3
44 {
45 
46 class WifiNetDevice;
47 class WifiMode;
48 class Time;
49 
59 typedef uint16_t WifiCodeRate;
60 const uint16_t WIFI_CODE_RATE_UNDEFINED = 0;
61 const uint16_t WIFI_CODE_RATE_1_2 = 1;
62 const uint16_t WIFI_CODE_RATE_2_3 = 2;
63 const uint16_t WIFI_CODE_RATE_3_4 = 3;
64 const uint16_t WIFI_CODE_RATE_5_6 = 4;
65 const uint16_t WIFI_CODE_RATE_5_8 = 5;
66 const uint16_t WIFI_CODE_RATE_13_16 = 6;
67 const uint16_t WIFI_CODE_RATE_1_4 = 7;
68 const uint16_t WIFI_CODE_RATE_13_28 = 8;
69 const uint16_t WIFI_CODE_RATE_13_21 = 9;
70 const uint16_t WIFI_CODE_RATE_52_63 = 10;
71 const uint16_t WIFI_CODE_RATE_13_14 = 11;
72 const uint16_t WIFI_CODE_RATE_7_8 = 12;
73 
79 {
94 };
95 
103 inline std::ostream&
104 operator<<(std::ostream& os, const WifiPreamble& preamble)
105 {
106  switch (preamble)
107  {
108  case WIFI_PREAMBLE_LONG:
109  return (os << "LONG");
110  case WIFI_PREAMBLE_SHORT:
111  return (os << "SHORT");
112  case WIFI_PREAMBLE_HT_MF:
113  return (os << "HT_MF");
115  return (os << "VHT_SU");
117  return (os << "VHT_MU");
119  return (os << "DMG_CTRL");
121  return (os << "DMG_SC");
123  return (os << "DMG_OFDM");
124  case WIFI_PREAMBLE_HE_SU:
125  return (os << "HE_SU");
127  return (os << "HE_ER_SU");
128  case WIFI_PREAMBLE_HE_MU:
129  return (os << "HE_MU");
130  case WIFI_PREAMBLE_HE_TB:
131  return (os << "HE_TB");
133  return (os << "EHT_MU");
135  return (os << "EHT_TB");
136  default:
137  NS_FATAL_ERROR("Invalid preamble");
138  return (os << "INVALID");
139  }
140 }
141 
149 {
165 };
166 
174 inline std::ostream&
175 operator<<(std::ostream& os, const WifiModulationClass& modulation)
176 {
177  switch (modulation)
178  {
179  case WIFI_MOD_CLASS_DSSS:
180  return (os << "DSSS");
182  return (os << "HR/DSSS");
184  return (os << "ERP-OFDM");
185  case WIFI_MOD_CLASS_OFDM:
186  return (os << "OFDM");
187  case WIFI_MOD_CLASS_HT:
188  return (os << "HT");
189  case WIFI_MOD_CLASS_VHT:
190  return (os << "VHT");
192  return (os << "DMG_CTRL");
194  return (os << "DMG_OFDM");
196  return (os << "DMG_SC");
198  return (os << "DMG_LP_SC");
199  case WIFI_MOD_CLASS_HE:
200  return (os << "HE");
201  case WIFI_MOD_CLASS_EHT:
202  return (os << "EHT");
203  default:
204  NS_FATAL_ERROR("Unknown modulation");
205  return (os << "unknown");
206  }
207 }
208 
214 {
236 };
237 
245 inline std::ostream&
246 operator<<(std::ostream& os, const WifiPpduField& field)
247 {
248  switch (field)
249  {
251  return (os << "preamble");
253  return (os << "non-HT header");
255  return (os << "HT-SIG");
257  return (os << "training");
259  return (os << "SIG-A");
261  return (os << "SIG-B");
263  return (os << "U-SIG");
265  return (os << "EHT-SIG");
267  return (os << "data");
268  default:
269  NS_FATAL_ERROR("Unknown field");
270  return (os << "unknown");
271  }
272 }
273 
279 {
283 };
284 
292 inline std::ostream&
293 operator<<(std::ostream& os, const WifiPpduType& type)
294 {
295  switch (type)
296  {
297  case WIFI_PPDU_TYPE_SU:
298  return (os << "SU");
300  return (os << "DL MU");
302  return (os << "UL MU");
303  default:
304  NS_FATAL_ERROR("Unknown type");
305  return (os << "unknown");
306  }
307 }
308 
314 {
315  UNKNOWN = 0,
339 };
340 
348 inline std::ostream&
349 operator<<(std::ostream& os, const WifiPhyRxfailureReason& reason)
350 {
351  switch (reason)
352  {
354  return (os << "UNSUPPORTED_SETTINGS");
355  case CHANNEL_SWITCHING:
356  return (os << "CHANNEL_SWITCHING");
357  case RXING:
358  return (os << "RXING");
359  case TXING:
360  return (os << "TXING");
361  case SLEEPING:
362  return (os << "SLEEPING");
363  case POWERED_OFF:
364  return (os << "OFF");
365  case TRUNCATED_TX:
366  return (os << "TRUNCATED_TX");
368  return (os << "BUSY_DECODING_PREAMBLE");
370  return (os << "PREAMBLE_DETECT_FAILURE");
372  return (os << "RECEPTION_ABORTED_BY_TX");
373  case L_SIG_FAILURE:
374  return (os << "L_SIG_FAILURE");
375  case HT_SIG_FAILURE:
376  return (os << "HT_SIG_FAILURE");
377  case SIG_A_FAILURE:
378  return (os << "SIG_A_FAILURE");
379  case SIG_B_FAILURE:
380  return (os << "SIG_B_FAILURE");
381  case U_SIG_FAILURE:
382  return (os << "U_SIG_FAILURE");
383  case EHT_SIG_FAILURE:
384  return (os << "EHT_SIG_FAILURE");
386  return (os << "PREAMBLE_DETECTION_PACKET_SWITCH");
388  return (os << "FRAME_CAPTURE_PACKET_SWITCH");
389  case OBSS_PD_CCA_RESET:
390  return (os << "OBSS_PD_CCA_RESET");
391  case HE_TB_PPDU_TOO_LATE:
392  return (os << "HE_TB_PPDU_TOO_LATE");
393  case FILTERED:
394  return (os << "FILTERED");
395  case DMG_HEADER_FAILURE:
396  return (os << "DMG_HEADER_FAILURE");
398  return (os << "DMG_ALLOCATION_ENDED");
399  case UNKNOWN:
400  default:
401  NS_FATAL_ERROR("Unknown reason");
402  return (os << "UNKNOWN");
403  }
404 }
405 
411 enum WifiChannelListType : uint8_t
412 {
417 };
418 
426 inline std::ostream&
427 operator<<(std::ostream& os, WifiChannelListType type)
428 {
429  switch (type)
430  {
432  return (os << "PRIMARY");
434  return (os << "SECONDARY");
436  return (os << "SECONDARY40");
438  return (os << "SECONDARY80");
439  default:
440  NS_FATAL_ERROR("Unknown wifi channel type");
441  return (os << "UNKNOWN");
442  }
443 }
444 
453 uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode, const Ptr<WifiNetDevice> device);
454 
464 uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode,
465  bool htShortGuardInterval,
466  Time heGuardInterval);
467 
476 WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble);
477 
486 
498  WifiModulationClass modClassAnswer);
499 
510 
517 bool IsMu(WifiPreamble preamble);
518 
525 bool IsDlMu(WifiPreamble preamble);
526 
533 bool IsUlMu(WifiPreamble preamble);
534 
542 
549 uint16_t GetMaximumChannelWidth(WifiModulationClass modulation);
550 
557 bool IsEht(WifiPreamble preamble);
558 
559 } // namespace ns3
560 
561 #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
@ HE_TB_PPDU_TOO_LATE
@ 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
@ 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:848
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...
const uint16_t WIFI_CODE_RATE_UNDEFINED
undefined coding rate
const uint16_t WIFI_CODE_RATE_3_4
3/4 coding rate
const uint16_t WIFI_CODE_RATE_7_8
7/8 coding rate
uint16_t GetMaximumChannelWidth(WifiModulationClass modulation)
Get the maximum channel width in MHz allowed for the given modulation class.
const uint16_t WIFI_CODE_RATE_13_16
13/16 coding rate
bool IsEht(WifiPreamble preamble)
Return true if a preamble corresponds to an EHT transmission.
const uint16_t WIFI_CODE_RATE_1_2
1/2 coding rate
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.
const uint16_t WIFI_CODE_RATE_5_8
5/8 coding rate
WifiModulationClass GetModulationClassForPreamble(WifiPreamble preamble)
Return the modulation class corresponding to the given preamble type.
const uint16_t WIFI_CODE_RATE_2_3
2/3 coding rate
const uint16_t WIFI_CODE_RATE_52_63
52/63 coding rate
const uint16_t WIFI_CODE_RATE_13_14
13/14 coding rate
uint16_t WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode, const Ptr< WifiNetDevice > device)
Convert the guard interval to nanoseconds based on the WifiMode.
const uint16_t WIFI_CODE_RATE_5_6
5/6 coding rate
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.
const uint16_t WIFI_CODE_RATE_13_21
13/21 coding rate
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:129
const uint16_t WIFI_CODE_RATE_13_28
13/28 coding rate
bool IsUlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a uplink multi-user transmission.
const uint16_t WIFI_CODE_RATE_1_4
1/4 coding rate