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
31namespace ns3 {
32
33NS_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
53static 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
64const std::array<uint64_t, 8>& GetErpOfdmRatesBpsList (void)
65{
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
88{
90 return GetErpOfdmRate6Mbps ();
91}
92
93Time
94ErpOfdmPhy::GetPreambleDuration (const WifiTxVector& /* txVector */) const
95{
96 return MicroSeconds (16); //L-STF + L-LTF
97}
98
99Time
100ErpOfdmPhy::GetHeaderDuration (const WifiTxVector& /* txVector */) const
101{
102 return MicroSeconds (4); //L-SIG
103}
104
106ErpOfdmPhy::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,
111 m_wifiPhy->GetPhyBand (), ObtainNextUid (txVector));
112}
113
114void
116{
117 for (const auto & rate : GetErpOfdmRatesBpsList ())
118 {
119 GetErpOfdmRate (rate);
120 }
121}
122
125{
126 switch (rate)
127 {
128 case 6000000:
129 return GetErpOfdmRate6Mbps ();
130 case 9000000:
131 return GetErpOfdmRate9Mbps ();
132 case 12000000:
133 return GetErpOfdmRate12Mbps ();
134 case 18000000:
135 return GetErpOfdmRate18Mbps ();
136 case 24000000:
137 return GetErpOfdmRate24Mbps ();
138 case 36000000:
139 return GetErpOfdmRate36Mbps ();
140 case 48000000:
141 return GetErpOfdmRate48Mbps ();
142 case 54000000:
143 return GetErpOfdmRate54Mbps ();
144 default:
145 NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for ERP-OFDM");
146 return WifiMode ();
147 }
148}
149
150#define GET_ERP_OFDM_MODE(x, f) \
151WifiMode \
152ErpOfdmPhy::Get ## x (void) \
153{ \
154 static WifiMode mode = CreateErpOfdmMode (#x, f); \
155 return mode; \
156}; \
157
158GET_ERP_OFDM_MODE (ErpOfdmRate6Mbps, true)
159GET_ERP_OFDM_MODE (ErpOfdmRate9Mbps, false)
160GET_ERP_OFDM_MODE (ErpOfdmRate12Mbps, true)
161GET_ERP_OFDM_MODE (ErpOfdmRate18Mbps, false)
162GET_ERP_OFDM_MODE (ErpOfdmRate24Mbps, true)
163GET_ERP_OFDM_MODE (ErpOfdmRate36Mbps, false)
164GET_ERP_OFDM_MODE (ErpOfdmRate48Mbps, false)
165GET_ERP_OFDM_MODE (ErpOfdmRate54Mbps, false)
166#undef GET_ERP_OFDM_MODE
167
168WifiMode
169ErpOfdmPhy::CreateErpOfdmMode (std::string uniqueName, bool isMandatory)
170{
171 // Check whether uniqueName is in lookup table
172 const auto it = m_erpOfdmModulationLookupTable.find (uniqueName);
173 NS_ASSERT_MSG (it != m_erpOfdmModulationLookupTable.end (), "ERP-OFDM mode cannot be created because it is not in the lookup table!");
174
175 return WifiModeFactory::CreateWifiMode (uniqueName,
177 isMandatory,
178 MakeBoundCallback (&GetCodeRate, uniqueName),
183}
184
186ErpOfdmPhy::GetCodeRate (const std::string& name)
187{
188 return m_erpOfdmModulationLookupTable.at (name).first;
189}
190
191uint16_t
192ErpOfdmPhy::GetConstellationSize (const std::string& name)
193{
194 return m_erpOfdmModulationLookupTable.at (name).second;
195}
196
197uint64_t
198ErpOfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth)
199{
200 WifiCodeRate codeRate = GetCodeRate (name);
201 uint16_t constellationSize = GetConstellationSize (name);
202 uint64_t dataRate = OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
203 return OfdmPhy::CalculatePhyRate (codeRate, dataRate);
204}
205
206uint64_t
207ErpOfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
208{
209 return GetPhyRate (txVector.GetMode ().GetUniqueName (),
210 txVector.GetChannelWidth ());
211}
212
213uint64_t
214ErpOfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
215{
216 return GetDataRate (txVector.GetMode ().GetUniqueName (),
217 txVector.GetChannelWidth ());
218}
219
220uint64_t
221ErpOfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth)
222{
223 WifiCodeRate codeRate = GetCodeRate (name);
224 uint16_t constellationSize = GetConstellationSize (name);
225 return OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
226}
227
228bool
230{
231 return true;
232}
233
236{
237 return 4095;
238}
239
240} //namespace ns3
241
242namespace {
243
248{
249public:
251 {
253 ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_ERP_OFDM, ns3::Create<ns3::ErpOfdmPhy> ());
254 }
256
257}
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:1114
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
Definition: phy-entity.h:884
std::map< std::string, CodeRateConstellationSizePair > ModulationLookupTable
A modulation lookup table using unique name of modulation as key.
Definition: phy-entity.h:499
std::list< WifiMode > m_modeList
the list of supported modes
Definition: phy-entity.h:887
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
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
const WifiPhyOperatingChannel & GetOperatingChannel(void) const
Get a const reference to the operating channel.
Definition: wifi-phy.cc:951
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:938
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:692
uint16_t GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const
Get the center frequency of the primary channel of the given width.
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:206
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:290
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs... bargs)
Make Callbacks with varying number of bound arguments.
Definition: callback.h:714
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1261
@ 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.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:661
const uint16_t WIFI_CODE_RATE_1_2
1/2 coding rate
const std::array< uint64_t, 8 > & GetErpOfdmRatesBpsList(void)
Get the array of possible ERP OFDM rates.
Definition: erp-ofdm-phy.cc:64
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...
static const std::array< uint64_t, 8 > s_erpOfdmRatesBpsList
ERP OFDM rates in bits per second.
Definition: erp-ofdm-phy.cc:53