A Discrete-Event Network Simulator
API
wifi-phy-common.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005,2006,2007 INRIA
4  * Copyright (c) 2020 Orange Labs
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20  * Rediet <getachew.redieteab@orange.com>
21  */
22 
23 #ifndef WIFI_PHY_COMMON_H
24 #define WIFI_PHY_COMMON_H
25 
26 #include <ostream>
27 #include "ns3/fatal-error.h"
28 #include "ns3/ptr.h"
29 
41 namespace ns3 {
42 
43 class WifiNetDevice;
44 class WifiMode;
45 class Time;
46 
56 typedef uint16_t WifiCodeRate;
57 const uint16_t WIFI_CODE_RATE_UNDEFINED = 0;
58 const uint16_t WIFI_CODE_RATE_1_2 = 1;
59 const uint16_t WIFI_CODE_RATE_2_3 = 2;
60 const uint16_t WIFI_CODE_RATE_3_4 = 3;
61 const uint16_t WIFI_CODE_RATE_5_6 = 4;
62 
68 {
78 };
79 
87 inline std::ostream& operator<< (std::ostream &os, const WifiPreamble &preamble)
88 {
89  switch (preamble)
90  {
91  case WIFI_PREAMBLE_LONG:
92  return (os << "LONG");
94  return (os << "SHORT");
96  return (os << "HT_MF");
98  return (os << "VHT_SU");
100  return (os << "VHT_MU");
101  case WIFI_PREAMBLE_HE_SU:
102  return (os << "HE_SU");
104  return (os << "HE_ER_SU");
105  case WIFI_PREAMBLE_HE_MU:
106  return (os << "HE_MU");
107  case WIFI_PREAMBLE_HE_TB:
108  return (os << "HE_TB");
109  default:
110  NS_FATAL_ERROR ("Invalid preamble");
111  return (os << "INVALID");
112  }
113 }
114 
122 {
133 };
134 
142 inline std::ostream& operator<< (std::ostream &os, const WifiModulationClass &modulation)
143 {
144  switch (modulation)
145  {
146  case WIFI_MOD_CLASS_DSSS:
147  return (os << "DSSS");
149  return (os << "HR/DSSS");
151  return (os << "ERP-OFDM");
152  case WIFI_MOD_CLASS_OFDM:
153  return (os << "OFDM");
154  case WIFI_MOD_CLASS_HT:
155  return (os << "HT");
156  case WIFI_MOD_CLASS_VHT:
157  return (os << "VHT");
158  case WIFI_MOD_CLASS_HE:
159  return (os << "HE");
160  default:
161  NS_FATAL_ERROR ("Unknown modulation");
162  return (os << "unknown");
163  }
164 }
165 
171 {
191 };
192 
200 inline std::ostream& operator<< (std::ostream &os, const WifiPpduField &field)
201 {
202  switch (field)
203  {
205  return (os << "preamble");
207  return (os << "non-HT header");
209  return (os << "HT-SIG");
211  return (os << "training");
213  return (os << "SIG-A");
215  return (os << "SIG-B");
217  return (os << "data");
218  default:
219  NS_FATAL_ERROR ("Unknown field");
220  return (os << "unknown");
221  }
222 }
223 
229 {
233 };
234 
242 inline std::ostream& operator<< (std::ostream &os, const WifiPpduType &type)
243 {
244  switch (type)
245  {
246  case WIFI_PPDU_TYPE_SU:
247  return (os << "SU");
249  return (os << "DL MU");
251  return (os << "UL MU");
252  default:
253  NS_FATAL_ERROR ("Unknown type");
254  return (os << "unknown");
255  }
256 }
257 
263 {
264  UNKNOWN = 0,
283  FILTERED
284 };
285 
293 inline std::ostream& operator<< (std::ostream &os, const WifiPhyRxfailureReason &reason)
294 {
295  switch (reason)
296  {
298  return (os << "UNSUPPORTED_SETTINGS");
299  case CHANNEL_SWITCHING:
300  return (os << "CHANNEL_SWITCHING");
301  case RXING:
302  return (os << "RXING");
303  case TXING:
304  return (os << "TXING");
305  case SLEEPING:
306  return (os << "SLEEPING");
307  case POWERED_OFF:
308  return (os << "OFF");
309  case TRUNCATED_TX:
310  return (os << "TRUNCATED_TX");
312  return (os << "BUSY_DECODING_PREAMBLE");
314  return (os << "PREAMBLE_DETECT_FAILURE");
316  return (os << "RECEPTION_ABORTED_BY_TX");
317  case L_SIG_FAILURE:
318  return (os << "L_SIG_FAILURE");
319  case HT_SIG_FAILURE:
320  return (os << "HT_SIG_FAILURE");
321  case SIG_A_FAILURE:
322  return (os << "SIG_A_FAILURE");
323  case SIG_B_FAILURE:
324  return (os << "SIG_B_FAILURE");
326  return (os << "PREAMBLE_DETECTION_PACKET_SWITCH");
328  return (os << "FRAME_CAPTURE_PACKET_SWITCH");
329  case OBSS_PD_CCA_RESET:
330  return (os << "OBSS_PD_CCA_RESET");
331  case HE_TB_PPDU_TOO_LATE:
332  return (os << "HE_TB_PPDU_TOO_LATE");
333  case FILTERED:
334  return (os << "FILTERED");
335  case UNKNOWN:
336  default:
337  NS_FATAL_ERROR ("Unknown reason");
338  return (os << "UNKNOWN");
339  }
340 }
341 
350 uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, const Ptr<WifiNetDevice> device);
351 
361 uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval);
362 
371 WifiPreamble GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble);
372 
382 uint16_t GetChannelWidthForTransmission (WifiMode mode, uint16_t maxAllowedChannelWidth);
394 uint16_t GetChannelWidthForTransmission (WifiMode mode, uint16_t operatingChannelWidth,
395  uint16_t maxSupportedChannelWidth);
396 
408 
418 Time GetPpduMaxTime (WifiPreamble preamble);
419 
426 bool IsMu (WifiPreamble preamble);
427 
434 bool IsDlMu (WifiPreamble preamble);
435 
442 bool IsUlMu (WifiPreamble preamble);
443 
444 } //namespace ns3
445 
446 #endif /* WIFI_PHY_COMMON_H */
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
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....
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
@ RECEPTION_ABORTED_BY_TX
@ SIG_A_FAILURE
@ CHANNEL_SWITCHING
@ BUSY_DECODING_PREAMBLE
@ SIG_B_FAILURE
@ HT_SIG_FAILURE
@ PREAMBLE_DETECTION_PACKET_SWITCH
@ WIFI_PREAMBLE_LONG
@ WIFI_PREAMBLE_HE_ER_SU
@ WIFI_PREAMBLE_HE_TB
@ WIFI_PREAMBLE_HE_MU
@ WIFI_PREAMBLE_HE_SU
@ WIFI_PREAMBLE_VHT_MU
@ WIFI_PREAMBLE_VHT_SU
@ WIFI_PREAMBLE_SHORT
@ WIFI_PREAMBLE_HT_MF
@ WIFI_PPDU_TYPE_DL_MU
@ WIFI_PPDU_TYPE_UL_MU
@ WIFI_PPDU_TYPE_SU
@ 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_HT
HT (Clause 19)
@ WIFI_MOD_CLASS_VHT
VHT (Clause 22)
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
@ WIFI_MOD_CLASS_DSSS
DSSS (Clause 15)
@ WIFI_MOD_CLASS_ERP_OFDM
ERP-OFDM (18.4)
@ 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_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_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:793
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_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.
uint16_t GetChannelWidthForTransmission(WifiMode mode, uint16_t maxAllowedChannelWidth)
Return the channel width that is allowed based on the selected mode and the given maximum channel wid...
const uint16_t WIFI_CODE_RATE_2_3
2/3 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.
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:139
bool IsUlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a uplink multi-user transmission.