A Discrete-Event Network Simulator
API
wifi-phy-common.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
18  */
19 
20 #include "wifi-phy-common.h"
21 
22 #include "wifi-mode.h"
23 #include "wifi-net-device.h"
24 
25 #include "ns3/he-configuration.h"
26 #include "ns3/ht-configuration.h"
27 
28 namespace ns3
29 {
30 
31 uint16_t
33 {
34  uint16_t gi = 800;
36  {
37  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration();
38  NS_ASSERT(heConfiguration); // If HE/EHT modulation is used, we should have a HE
39  // configuration attached
40  gi = static_cast<uint16_t>(heConfiguration->GetGuardInterval().GetNanoSeconds());
41  }
42  else if (mode.GetModulationClass() == WIFI_MOD_CLASS_HT ||
44  {
45  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration();
46  NS_ASSERT(htConfiguration); // If HT/VHT modulation is used, we should have a HT
47  // configuration attached
48  gi = htConfiguration->GetShortGuardIntervalSupported() ? 400 : 800;
49  }
50  return gi;
51 }
52 
53 uint16_t
54 ConvertGuardIntervalToNanoSeconds(WifiMode mode, bool htShortGuardInterval, Time heGuardInterval)
55 {
56  uint16_t gi;
58  {
59  gi = static_cast<uint16_t>(heGuardInterval.GetNanoSeconds());
60  }
61  else if (mode.GetModulationClass() == WIFI_MOD_CLASS_HT ||
63  {
64  gi = htShortGuardInterval ? 400 : 800;
65  }
66  else
67  {
68  gi = 800;
69  }
70  return gi;
71 }
72 
74 GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble)
75 {
76  if (modulation == WIFI_MOD_CLASS_EHT)
77  {
78  return WIFI_PREAMBLE_EHT_MU;
79  }
80  else if (modulation == WIFI_MOD_CLASS_HE)
81  {
82  return WIFI_PREAMBLE_HE_SU;
83  }
84  else if (modulation == WIFI_MOD_CLASS_DMG_CTRL)
85  {
87  }
88  else if (modulation == WIFI_MOD_CLASS_DMG_SC)
89  {
90  return WIFI_PREAMBLE_DMG_SC;
91  }
92  else if (modulation == WIFI_MOD_CLASS_DMG_OFDM)
93  {
95  }
96  else if (modulation == WIFI_MOD_CLASS_VHT)
97  {
98  return WIFI_PREAMBLE_VHT_SU;
99  }
100  else if (modulation == WIFI_MOD_CLASS_HT)
101  {
102  return WIFI_PREAMBLE_HT_MF; // HT_GF has been removed
103  }
104  else if (modulation == WIFI_MOD_CLASS_HR_DSSS &&
105  useShortPreamble) // ERP_DSSS is modeled through HR_DSSS (since same preamble and
106  // modulation)
107  {
108  return WIFI_PREAMBLE_SHORT;
109  }
110  else
111  {
112  return WIFI_PREAMBLE_LONG;
113  }
114 }
115 
118 {
119  switch (preamble)
120  {
121  case WIFI_PREAMBLE_HT_MF:
122  return WIFI_MOD_CLASS_HT;
125  return WIFI_MOD_CLASS_VHT;
126  case WIFI_PREAMBLE_HE_SU:
128  case WIFI_PREAMBLE_HE_MU:
129  case WIFI_PREAMBLE_HE_TB:
130  return WIFI_MOD_CLASS_HE;
133  return WIFI_MOD_CLASS_EHT;
134  default:
135  NS_ABORT_MSG("Unsupported preamble type: " << preamble);
136  }
137  return WIFI_MOD_CLASS_UNKNOWN;
138 }
139 
140 bool
142  WifiModulationClass modClassAnswer)
143 {
144  switch (modClassReq)
145  {
146  case WIFI_MOD_CLASS_DSSS:
147  return (modClassAnswer == WIFI_MOD_CLASS_DSSS);
149  return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS);
151  return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS ||
152  modClassAnswer == WIFI_MOD_CLASS_ERP_OFDM);
153  case WIFI_MOD_CLASS_OFDM:
154  return (modClassAnswer == WIFI_MOD_CLASS_OFDM);
155  case WIFI_MOD_CLASS_HT:
156  case WIFI_MOD_CLASS_VHT:
157  case WIFI_MOD_CLASS_HE:
158  case WIFI_MOD_CLASS_EHT:
159  return true;
160  default:
161  NS_FATAL_ERROR("Modulation class not defined");
162  return false;
163  }
164 }
165 
166 Time
168 {
169  Time duration;
170 
171  switch (preamble)
172  {
173  case WIFI_PREAMBLE_HT_MF:
176  case WIFI_PREAMBLE_HE_SU:
178  case WIFI_PREAMBLE_HE_MU:
179  case WIFI_PREAMBLE_HE_TB:
182  duration = MicroSeconds(5484);
183  break;
184  default:
185  duration = MicroSeconds(0);
186  break;
187  }
188  return duration;
189 }
190 
191 bool
193 {
194  return (IsDlMu(preamble) || IsUlMu(preamble));
195 }
196 
197 bool
199 {
200  return ((preamble == WIFI_PREAMBLE_HE_MU) || (preamble == WIFI_PREAMBLE_EHT_MU));
201 }
202 
203 bool
205 {
206  return ((preamble == WIFI_PREAMBLE_HE_TB) || (preamble == WIFI_PREAMBLE_EHT_TB));
207 }
208 
211 {
213  switch (standard)
214  {
216  [[fallthrough]];
218  modulationClass = WIFI_MOD_CLASS_OFDM;
219  break;
221  modulationClass = WIFI_MOD_CLASS_DSSS;
222  break;
224  modulationClass = WIFI_MOD_CLASS_ERP_OFDM;
225  break;
227  modulationClass = WIFI_MOD_CLASS_HT;
228  break;
230  modulationClass = WIFI_MOD_CLASS_VHT;
231  break;
233  modulationClass = WIFI_MOD_CLASS_HE;
234  break;
236  modulationClass = WIFI_MOD_CLASS_EHT;
237  break;
239  [[fallthrough]];
240  default:
241  NS_ASSERT_MSG(false, "Unsupported standard " << standard);
242  break;
243  }
244  return modulationClass;
245 }
246 
247 uint16_t
249 {
250  switch (modulation)
251  {
252  case WIFI_MOD_CLASS_DSSS:
254  return 22;
255  case WIFI_MOD_CLASS_OFDM:
257  return 20;
258  case WIFI_MOD_CLASS_HT:
259  return 40;
260  case WIFI_MOD_CLASS_VHT:
261  case WIFI_MOD_CLASS_HE:
262  return 160;
263  case WIFI_MOD_CLASS_EHT:
264  return 160; // TODO update when 320 MHz channels are supported
265  default:
266  NS_ABORT_MSG("Unknown modulation class: " << modulation);
267  return 0;
268  }
269 }
270 
271 bool
273 {
274  return ((preamble == WIFI_PREAMBLE_EHT_MU) || (preamble == WIFI_PREAMBLE_EHT_TB));
275 }
276 
277 } // namespace ns3
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
int64_t GetNanoSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:418
represent a single transmission mode
Definition: wifi-mode.h:51
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:185
Ptr< HtConfiguration > GetHtConfiguration() const
Ptr< HeConfiguration > GetHeConfiguration() const
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:66
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:86
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:49
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1350
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802....
@ WIFI_STANDARD_80211a
@ WIFI_STANDARD_80211p
@ WIFI_STANDARD_80211be
@ WIFI_STANDARD_80211n
@ WIFI_STANDARD_80211g
@ WIFI_STANDARD_80211ax
@ WIFI_STANDARD_UNSPECIFIED
@ WIFI_STANDARD_80211ac
@ WIFI_STANDARD_80211b
@ 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_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_DSSS
DSSS (Clause 15)
@ WIFI_MOD_CLASS_ERP_OFDM
ERP-OFDM (18.4)
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.
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.
WifiModulationClass GetModulationClassForPreamble(WifiPreamble preamble)
Return the modulation class corresponding to the given preamble type.
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.
bool IsUlMu(WifiPreamble preamble)
Return true if a preamble corresponds to a uplink multi-user transmission.
Declaration of the following enums: