A Discrete-Event Network Simulator
API
erp-ofdm-phy.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
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: Rediet <getachew.redieteab@orange.com>
19  * Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
20  * Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
21  */
22 
23 #include <array>
24 #include "erp-ofdm-phy.h"
25 #include "erp-ofdm-ppdu.h"
26 #include "ns3/wifi-psdu.h"
27 #include "ns3/wifi-phy.h" //only used for static mode constructor
28 #include "ns3/log.h"
29 #include "ns3/assert.h"
30 
31 namespace ns3 {
32 
33 NS_LOG_COMPONENT_DEFINE ("ErpOfdmPhy");
34 
35 /*******************************************************
36  * ERP-OFDM PHY (IEEE 802.11-2016, clause 18)
37  *******************************************************/
38 
39 /* *NS_CHECK_STYLE_OFF* */
41  // Unique name Code rate Constellation size
42  { "ErpOfdmRate6Mbps", { WIFI_CODE_RATE_1_2, 2 } },
43  { "ErpOfdmRate9Mbps", { WIFI_CODE_RATE_3_4, 2 } },
44  { "ErpOfdmRate12Mbps", { WIFI_CODE_RATE_1_2, 4 } },
45  { "ErpOfdmRate18Mbps", { WIFI_CODE_RATE_3_4, 4 } },
46  { "ErpOfdmRate24Mbps", { WIFI_CODE_RATE_1_2, 16 } },
47  { "ErpOfdmRate36Mbps", { WIFI_CODE_RATE_3_4, 16 } },
48  { "ErpOfdmRate48Mbps", { WIFI_CODE_RATE_2_3, 64 } },
49  { "ErpOfdmRate54Mbps", { WIFI_CODE_RATE_3_4, 64 } }
50 };
51 
53 static const std::array<uint64_t, 8> s_erpOfdmRatesBpsList =
54  { 6000000, 9000000, 12000000, 18000000,
55  24000000, 36000000, 48000000, 54000000};
56 
57 /* *NS_CHECK_STYLE_ON* */
58 
64 const std::array<uint64_t, 8>& GetErpOfdmRatesBpsList (void)
65 {
66  return s_erpOfdmRatesBpsList;
67 };
68 
70  : OfdmPhy (OFDM_PHY_DEFAULT, false) //don't add OFDM modes to list
71 {
72  NS_LOG_FUNCTION (this);
73  for (const auto & rate : GetErpOfdmRatesBpsList ())
74  {
75  WifiMode mode = GetErpOfdmRate (rate);
76  NS_LOG_LOGIC ("Add " << mode << " to list");
77  m_modeList.emplace_back (mode);
78  }
79 }
80 
82 {
83  NS_LOG_FUNCTION (this);
84 }
85 
87 ErpOfdmPhy::GetHeaderMode (const WifiTxVector& txVector) const
88 {
90  return GetErpOfdmRate6Mbps ();
91 }
92 
93 Time
94 ErpOfdmPhy::GetPreambleDuration (const WifiTxVector& /* txVector */) const
95 {
96  return MicroSeconds (16); //L-STF + L-LTF
97 }
98 
99 Time
100 ErpOfdmPhy::GetHeaderDuration (const WifiTxVector& /* txVector */) const
101 {
102  return MicroSeconds (4); //L-SIG
103 }
104 
106 ErpOfdmPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time /* ppduDuration */)
107 {
108  NS_LOG_FUNCTION (this << psdus << txVector);
109  return Create<ErpOfdmPpdu> (psdus.begin ()->second, txVector, m_wifiPhy->GetPhyBand (),
110  ObtainNextUid (txVector));
111 }
112 
113 void
115 {
116  for (const auto & rate : GetErpOfdmRatesBpsList ())
117  {
118  GetErpOfdmRate (rate);
119  }
120 }
121 
122 WifiMode
124 {
125  switch (rate)
126  {
127  case 6000000:
128  return GetErpOfdmRate6Mbps ();
129  case 9000000:
130  return GetErpOfdmRate9Mbps ();
131  case 12000000:
132  return GetErpOfdmRate12Mbps ();
133  case 18000000:
134  return GetErpOfdmRate18Mbps ();
135  case 24000000:
136  return GetErpOfdmRate24Mbps ();
137  case 36000000:
138  return GetErpOfdmRate36Mbps ();
139  case 48000000:
140  return GetErpOfdmRate48Mbps ();
141  case 54000000:
142  return GetErpOfdmRate54Mbps ();
143  default:
144  NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for ERP-OFDM");
145  return WifiMode ();
146  }
147 }
148 
149 #define GET_ERP_OFDM_MODE(x, f) \
150 WifiMode \
151 ErpOfdmPhy::Get ## x (void) \
152 { \
153  static WifiMode mode = CreateErpOfdmMode (#x, f); \
154  return mode; \
155 }; \
156 
157 GET_ERP_OFDM_MODE (ErpOfdmRate6Mbps, true)
158 GET_ERP_OFDM_MODE (ErpOfdmRate9Mbps, false)
159 GET_ERP_OFDM_MODE (ErpOfdmRate12Mbps, true)
160 GET_ERP_OFDM_MODE (ErpOfdmRate18Mbps, false)
161 GET_ERP_OFDM_MODE (ErpOfdmRate24Mbps, true)
162 GET_ERP_OFDM_MODE (ErpOfdmRate36Mbps, false)
163 GET_ERP_OFDM_MODE (ErpOfdmRate48Mbps, false)
164 GET_ERP_OFDM_MODE (ErpOfdmRate54Mbps, false)
165 #undef GET_ERP_OFDM_MODE
166 
167 WifiMode
168 ErpOfdmPhy::CreateErpOfdmMode (std::string uniqueName, bool isMandatory)
169 {
170  // Check whether uniqueName is in lookup table
171  const auto it = m_erpOfdmModulationLookupTable.find (uniqueName);
172  NS_ASSERT_MSG (it != m_erpOfdmModulationLookupTable.end (), "ERP-OFDM mode cannot be created because it is not in the lookup table!");
173 
174  return WifiModeFactory::CreateWifiMode (uniqueName,
176  isMandatory,
177  MakeBoundCallback (&GetCodeRate, uniqueName),
182 }
183 
185 ErpOfdmPhy::GetCodeRate (const std::string& name)
186 {
187  return m_erpOfdmModulationLookupTable.at (name).first;
188 }
189 
190 uint16_t
191 ErpOfdmPhy::GetConstellationSize (const std::string& name)
192 {
193  return m_erpOfdmModulationLookupTable.at (name).second;
194 }
195 
196 uint64_t
197 ErpOfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth)
198 {
199  WifiCodeRate codeRate = GetCodeRate (name);
200  uint16_t constellationSize = GetConstellationSize (name);
201  uint64_t dataRate = OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
202  return OfdmPhy::CalculatePhyRate (codeRate, dataRate);
203 }
204 
205 uint64_t
206 ErpOfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
207 {
208  return GetPhyRate (txVector.GetMode ().GetUniqueName (),
209  txVector.GetChannelWidth ());
210 }
211 
212 uint64_t
213 ErpOfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
214 {
215  return GetDataRate (txVector.GetMode ().GetUniqueName (),
216  txVector.GetChannelWidth ());
217 }
218 
219 uint64_t
220 ErpOfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth)
221 {
222  WifiCodeRate codeRate = GetCodeRate (name);
223  uint16_t constellationSize = GetConstellationSize (name);
224  return OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
225 }
226 
227 bool
228 ErpOfdmPhy::IsAllowed (const WifiTxVector& /*txVector*/)
229 {
230  return true;
231 }
232 
233 uint32_t
235 {
236  return 4095;
237 }
238 
239 } //namespace ns3
240 
241 namespace {
242 
246 static class ConstructorErpOfdm
247 {
248 public:
250  {
252  ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_ERP_OFDM, ns3::Create<ns3::ErpOfdmPhy> ());
253  }
255 
256 }
static uint64_t GetPhyRateFromTxVector(const WifiTxVector &txVector, uint16_t staId)
Return the PHY rate corresponding to the supplied TXVECTOR.
static const ModulationLookupTable m_erpOfdmModulationLookupTable
lookup table to retrieve code rate and constellation size corresponding to a unique name of modulatio...
Definition: erp-ofdm-phy.h:209
static WifiCodeRate GetCodeRate(const std::string &name)
Return the WifiCodeRate from the ERP-OFDM mode's unique name using ModulationLookupTable.
Time GetPreambleDuration(const WifiTxVector &txVector) const override
Definition: erp-ofdm-phy.cc:94
Time GetHeaderDuration(const WifiTxVector &txVector) const override
static WifiMode GetErpOfdmRate6Mbps(void)
Return a WifiMode for ERP-OFDM at 6 Mbps.
static WifiMode GetErpOfdmRate24Mbps(void)
Return a WifiMode for ERP-OFDM at 24 Mbps.
static WifiMode GetErpOfdmRate36Mbps(void)
Return a WifiMode for ERP-OFDM at 36 Mbps.
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
static uint64_t GetDataRateFromTxVector(const WifiTxVector &txVector, uint16_t staId)
Return the data rate corresponding to the supplied TXVECTOR.
uint32_t GetMaxPsduSize(void) const override
Get the maximum PSDU size in bytes.
static uint64_t GetPhyRate(const std::string &name, uint16_t channelWidth)
Return the PHY rate from the ERP-OFDM mode's unique name and the supplied parameters.
static WifiMode GetErpOfdmRate(uint64_t rate)
Return a WifiMode for ERP-OFDM corresponding to the provided rate.
static WifiMode GetErpOfdmRate18Mbps(void)
Return a WifiMode for ERP-OFDM at 18 Mbps.
static WifiMode GetErpOfdmRate9Mbps(void)
Return a WifiMode for ERP-OFDM at 9 Mbps.
static WifiMode GetErpOfdmRate48Mbps(void)
Return a WifiMode for ERP-OFDM at 48 Mbps.
static WifiMode GetErpOfdmRate12Mbps(void)
Return a WifiMode for ERP-OFDM at 12 Mbps.
static WifiMode GetErpOfdmRate54Mbps(void)
Return a WifiMode for ERP-OFDM at 54 Mbps.
static bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
ErpOfdmPhy()
Constructor for ERP-OFDM PHY.
Definition: erp-ofdm-phy.cc:69
static void InitializeModes(void)
Initialize all ERP-OFDM modes.
static uint16_t GetConstellationSize(const std::string &name)
Return the constellation size from the ERP-OFDM mode's unique name using ModulationLookupTable.
static WifiMode CreateErpOfdmMode(std::string uniqueName, bool isMandatory)
Create an ERP-OFDM mode from a unique name, the unique name must already be contained inside Modulati...
virtual ~ErpOfdmPhy()
Destructor for ERP-OFDM PHY.
Definition: erp-ofdm-phy.cc:81
WifiMode GetHeaderMode(const WifiTxVector &txVector) const override
Definition: erp-ofdm-phy.cc:87
static uint64_t GetDataRate(const std::string &name, uint16_t channelWidth)
Return the data rate from the ERP-OFDM mode's unique name and the supplied parameters.
PHY entity for OFDM (11a)
Definition: ofdm-phy.h:61
static uint64_t CalculateDataRate(WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth)
Calculates data rate from the supplied parameters.
Definition: ofdm-phy.cc:568
static uint64_t CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate)
Calculate the PHY rate in bps from code rate and data rate.
Definition: ofdm-phy.cc:522
virtual uint64_t ObtainNextUid(const WifiTxVector &txVector)
Obtain the next UID for the PPDU to transmit.
Definition: phy-entity.cc:1027
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
Definition: phy-entity.h:791
std::map< std::string, CodeRateConstellationSizePair > ModulationLookupTable
A modulation lookup table using unique name of modulation as key.
Definition: phy-entity.h:487
std::list< WifiMode > m_modeList
the list of supported modes
Definition: phy-entity.h:794
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
static WifiMode CreateWifiMode(std::string uniqueName, WifiModulationClass modClass, bool isMandatory, CodeRateCallback codeRateCallback, ConstellationSizeCallback constellationSizeCallback, PhyRateCallback phyRateCallback, DataRateCallback dataRateCallback, AllowedCallback isAllowedCallback)
Definition: wifi-mode.cc:260
represent a single transmission mode
Definition: wifi-mode.h:48
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:177
std::string GetUniqueName(void) const
Definition: wifi-mode.cc:140
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:887
static void AddStaticPhyEntity(WifiModulationClass modulation, Ptr< PhyEntity > phyEntity)
Add the PHY entity to the map of implemented PHY entities for the given modulation class.
Definition: wifi-phy.cc:652
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode.
uint16_t GetChannelWidth(void) const
#define GET_ERP_OFDM_MODE(x, f)
Declaration of ns3::ErpOfdmPhy class.
Declaration of ns3::ErpOfdmPpdu class.
#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_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:88
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:50
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1709
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1260
@ WIFI_MOD_CLASS_ERP_OFDM
ERP-OFDM (18.4)
@ OFDM_PHY_DEFAULT
Definition: ofdm-phy.h:45
static class anonymous_namespace{erp-ofdm-phy.cc}::ConstructorErpOfdm g_constructor_erp_ofdm
the constructor for ERP-OFDM modes
Every class exported by the ns3 library is enclosed in the ns3 namespace.
const uint16_t WIFI_CODE_RATE_3_4
3/4 coding rate
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
const uint16_t WIFI_CODE_RATE_1_2
1/2 coding rate
const uint16_t WIFI_CODE_RATE_2_3
2/3 coding rate
const std::array< uint64_t, 8 > & GetErpOfdmRatesBpsList(void)
Get the array of possible ERP OFDM rates.
Definition: erp-ofdm-phy.cc:64
uint16_t WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
static const std::array< uint64_t, 8 > s_erpOfdmRatesBpsList
ERP OFDM rates in bits per second.
Definition: erp-ofdm-phy.cc:53
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648