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, m_wifiPhy->GetPhyBand (),
110 ObtainNextUid (txVector));
111}
112
113void
115{
116 for (const auto & rate : GetErpOfdmRatesBpsList ())
117 {
118 GetErpOfdmRate (rate);
119 }
120}
121
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) \
150WifiMode \
151ErpOfdmPhy::Get ## x (void) \
152{ \
153 static WifiMode mode = CreateErpOfdmMode (#x, f); \
154 return mode; \
155}; \
156
157GET_ERP_OFDM_MODE (ErpOfdmRate6Mbps, true)
158GET_ERP_OFDM_MODE (ErpOfdmRate9Mbps, false)
159GET_ERP_OFDM_MODE (ErpOfdmRate12Mbps, true)
160GET_ERP_OFDM_MODE (ErpOfdmRate18Mbps, false)
161GET_ERP_OFDM_MODE (ErpOfdmRate24Mbps, true)
162GET_ERP_OFDM_MODE (ErpOfdmRate36Mbps, false)
163GET_ERP_OFDM_MODE (ErpOfdmRate48Mbps, false)
164GET_ERP_OFDM_MODE (ErpOfdmRate54Mbps, false)
165#undef GET_ERP_OFDM_MODE
166
167WifiMode
168ErpOfdmPhy::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
185ErpOfdmPhy::GetCodeRate (const std::string& name)
186{
187 return m_erpOfdmModulationLookupTable.at (name).first;
188}
189
190uint16_t
191ErpOfdmPhy::GetConstellationSize (const std::string& name)
192{
193 return m_erpOfdmModulationLookupTable.at (name).second;
194}
195
196uint64_t
197ErpOfdmPhy::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
205uint64_t
206ErpOfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
207{
208 return GetPhyRate (txVector.GetMode ().GetUniqueName (),
209 txVector.GetChannelWidth ());
210}
211
212uint64_t
213ErpOfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
214{
215 return GetDataRate (txVector.GetMode ().GetUniqueName (),
216 txVector.GetChannelWidth ());
217}
218
219uint64_t
220ErpOfdmPhy::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
227bool
229{
230 return true;
231}
232
235{
236 return 4095;
237}
238
239} //namespace ns3
240
241namespace {
242
247{
248public:
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:567
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:521
virtual uint64_t ObtainNextUid(const WifiTxVector &txVector)
Obtain the next UID for the PPDU to transmit.
Definition: phy-entity.cc:1026
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:870
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:635
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 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
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