A Discrete-Event Network Simulator
API
wifi-phy-common.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2021
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  * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
19  */
20 
21 #include "wifi-phy-common.h"
22 #include "wifi-mode.h"
23 #include "wifi-net-device.h"
24 #include "ns3/ht-configuration.h"
25 #include "ns3/he-configuration.h"
26 
27 namespace ns3 {
28 
29 uint16_t
31 {
32  uint16_t gi = 800;
34  {
35  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
36  NS_ASSERT (heConfiguration); //If HE modulation is used, we should have a HE configuration attached
37  gi = static_cast<uint16_t> (heConfiguration->GetGuardInterval ().GetNanoSeconds ());
38  }
40  {
41  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
42  NS_ASSERT (htConfiguration); //If HT/VHT modulation is used, we should have a HT configuration attached
43  gi = htConfiguration->GetShortGuardIntervalSupported () ? 400 : 800;
44  }
45  return gi;
46 }
47 
48 uint16_t
49 ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval)
50 {
51  uint16_t gi;
53  {
54  gi = static_cast<uint16_t> (heGuardInterval.GetNanoSeconds ());
55  }
57  {
58  gi = htShortGuardInterval ? 400 : 800;
59  }
60  else
61  {
62  gi = 800;
63  }
64  return gi;
65 }
66 
67 uint16_t
68 GetChannelWidthForTransmission (WifiMode mode, uint16_t maxAllowedChannelWidth)
69 {
70  WifiModulationClass modulationClass = mode.GetModulationClass ();
71  if (maxAllowedChannelWidth > 20
72  && (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_OFDM // all non-HT OFDM control and management frames
73  || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_ERP_OFDM)) // special case of beacons at 2.4 GHz
74  {
75  return 20;
76  }
77  //at 2.4 GHz basic rate can be non-ERP DSSS
78  if (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_DSSS
79  || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_HR_DSSS)
80  {
81  return 22;
82  }
83  return maxAllowedChannelWidth;
84 }
85 
86 uint16_t
87 GetChannelWidthForTransmission (WifiMode mode, uint16_t operatingChannelWidth,
88  uint16_t maxSupportedChannelWidth)
89 {
90  return GetChannelWidthForTransmission (mode, (operatingChannelWidth < maxSupportedChannelWidth)
91  ? operatingChannelWidth : maxSupportedChannelWidth);
92 }
93 
95 GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble)
96 {
97  if (modulation == WIFI_MOD_CLASS_HE)
98  {
99  return WIFI_PREAMBLE_HE_SU;
100  }
101  else if (modulation == WIFI_MOD_CLASS_VHT)
102  {
103  return WIFI_PREAMBLE_VHT_SU;
104  }
105  else if (modulation == WIFI_MOD_CLASS_HT)
106  {
107  return WIFI_PREAMBLE_HT_MF; // HT_GF has been removed
108  }
109  else if (modulation == WIFI_MOD_CLASS_HR_DSSS && useShortPreamble) //ERP_DSSS is modeled through HR_DSSS (since same preamble and modulation)
110  {
111  return WIFI_PREAMBLE_SHORT;
112  }
113  else
114  {
115  return WIFI_PREAMBLE_LONG;
116  }
117 }
118 
119 bool
121 {
122  switch (modClassReq)
123  {
124  case WIFI_MOD_CLASS_DSSS:
125  return (modClassAnswer == WIFI_MOD_CLASS_DSSS);
127  return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS);
129  return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS || modClassAnswer == WIFI_MOD_CLASS_ERP_OFDM);
130  case WIFI_MOD_CLASS_OFDM:
131  return (modClassAnswer == WIFI_MOD_CLASS_OFDM);
132  case WIFI_MOD_CLASS_HT:
133  case WIFI_MOD_CLASS_VHT:
134  case WIFI_MOD_CLASS_HE:
135  return true;
136  default:
137  NS_FATAL_ERROR ("Modulation class not defined");
138  return false;
139  }
140 }
141 
142 Time
144 {
145  Time duration;
146 
147  switch (preamble)
148  {
149  case WIFI_PREAMBLE_HT_MF:
152  case WIFI_PREAMBLE_HE_SU:
154  case WIFI_PREAMBLE_HE_MU:
155  case WIFI_PREAMBLE_HE_TB:
156  duration = MicroSeconds (5484);
157  break;
158  default:
159  duration = MicroSeconds (0);
160  break;
161  }
162  return duration;
163 }
164 
165 bool
166 IsMu (WifiPreamble preamble)
167 {
168  return (IsDlMu (preamble) || IsUlMu (preamble));
169 }
170 
171 bool
173 {
174  return (preamble == WIFI_PREAMBLE_HE_MU);
175 }
176 
177 bool
179 {
180  return (preamble == WIFI_PREAMBLE_HE_TB);
181 }
182 
183 } //namespace ns3
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:391
represent a single transmission mode
Definition: wifi-mode.h:48
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:177
Ptr< HtConfiguration > GetHtConfiguration(void) const
Ptr< HeConfiguration > GetHeConfiguration(void) 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:67
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1260
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_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_MOD_CLASS_OFDM
OFDM (Clause 17)
@ WIFI_MOD_CLASS_HR_DSSS
HR/DSSS (Clause 16)
@ 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)
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...
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...
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.
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: