A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
erp-ofdm-phy.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Orange Labs
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 * Authors: Rediet <getachew.redieteab@orange.com>
18 * Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
19 * Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
20 */
21
22#include "erp-ofdm-phy.h"
23
24#include "erp-ofdm-ppdu.h"
25
26#include "ns3/assert.h"
27#include "ns3/log.h"
28#include "ns3/wifi-phy.h" //only used for static mode constructor
29#include "ns3/wifi-psdu.h"
30
31#include <array>
32
33#undef NS_LOG_APPEND_CONTEXT
34#define NS_LOG_APPEND_CONTEXT WIFI_PHY_NS_LOG_APPEND_CONTEXT(m_wifiPhy)
35
36namespace ns3
37{
38
39NS_LOG_COMPONENT_DEFINE("ErpOfdmPhy");
40
41/*******************************************************
42 * ERP-OFDM PHY (IEEE 802.11-2016, clause 18)
43 *******************************************************/
44
45// clang-format off
46
48 // Unique name Code rate Constellation size
49 { "ErpOfdmRate6Mbps", { WIFI_CODE_RATE_1_2, 2 } },
50 { "ErpOfdmRate9Mbps", { WIFI_CODE_RATE_3_4, 2 } },
51 { "ErpOfdmRate12Mbps", { WIFI_CODE_RATE_1_2, 4 } },
52 { "ErpOfdmRate18Mbps", { WIFI_CODE_RATE_3_4, 4 } },
53 { "ErpOfdmRate24Mbps", { WIFI_CODE_RATE_1_2, 16 } },
54 { "ErpOfdmRate36Mbps", { WIFI_CODE_RATE_3_4, 16 } },
55 { "ErpOfdmRate48Mbps", { WIFI_CODE_RATE_2_3, 64 } },
56 { "ErpOfdmRate54Mbps", { WIFI_CODE_RATE_3_4, 64 } }
57};
58
59/// ERP OFDM rates in bits per second
60static const std::array<uint64_t, 8> s_erpOfdmRatesBpsList =
61 { 6000000, 9000000, 12000000, 18000000,
62 24000000, 36000000, 48000000, 54000000};
63
64// clang-format on
65
66/**
67 * Get the array of possible ERP OFDM rates.
68 *
69 * \return the ERP OFDM rates in bits per second
70 */
71const std::array<uint64_t, 8>&
73{
75}
76
78 : OfdmPhy(OFDM_PHY_DEFAULT, false) // don't add OFDM modes to list
79{
80 NS_LOG_FUNCTION(this);
81 for (const auto& rate : GetErpOfdmRatesBpsList())
82 {
83 WifiMode mode = GetErpOfdmRate(rate);
84 NS_LOG_LOGIC("Add " << mode << " to list");
85 m_modeList.emplace_back(mode);
86 }
87}
88
90{
91 NS_LOG_FUNCTION(this);
92}
93
96{
98 return GetErpOfdmRate6Mbps();
99}
100
101Time
103{
104 return MicroSeconds(16); // L-STF + L-LTF
105}
106
107Time
108ErpOfdmPhy::GetHeaderDuration(const WifiTxVector& /* txVector */) const
109{
110 return MicroSeconds(4); // L-SIG
111}
112
115 const WifiTxVector& txVector,
116 Time /* ppduDuration */)
117{
118 NS_LOG_FUNCTION(this << psdus << txVector);
119 return Create<ErpOfdmPpdu>(
120 psdus.begin()->second,
121 txVector,
123 m_wifiPhy->GetLatestPhyEntity()->ObtainNextUid(
124 txVector)); // use latest PHY entity to handle MU-RTS sent with non-HT rate
125}
126
127void
129{
130 for (const auto& rate : GetErpOfdmRatesBpsList())
131 {
132 GetErpOfdmRate(rate);
133 }
134}
135
138{
139 switch (rate)
140 {
141 case 6000000:
142 return GetErpOfdmRate6Mbps();
143 case 9000000:
144 return GetErpOfdmRate9Mbps();
145 case 12000000:
146 return GetErpOfdmRate12Mbps();
147 case 18000000:
148 return GetErpOfdmRate18Mbps();
149 case 24000000:
150 return GetErpOfdmRate24Mbps();
151 case 36000000:
152 return GetErpOfdmRate36Mbps();
153 case 48000000:
154 return GetErpOfdmRate48Mbps();
155 case 54000000:
156 return GetErpOfdmRate54Mbps();
157 default:
158 NS_ABORT_MSG("Inexistent rate (" << rate << " bps) requested for ERP-OFDM");
159 return WifiMode();
160 }
161}
162
163#define GET_ERP_OFDM_MODE(x, f) \
164 WifiMode ErpOfdmPhy::Get##x() \
165 { \
166 static WifiMode mode = CreateErpOfdmMode(#x, f); \
167 return mode; \
168 }
169
170GET_ERP_OFDM_MODE(ErpOfdmRate6Mbps, true)
171GET_ERP_OFDM_MODE(ErpOfdmRate9Mbps, false)
172GET_ERP_OFDM_MODE(ErpOfdmRate12Mbps, true)
173GET_ERP_OFDM_MODE(ErpOfdmRate18Mbps, false)
174GET_ERP_OFDM_MODE(ErpOfdmRate24Mbps, true)
175GET_ERP_OFDM_MODE(ErpOfdmRate36Mbps, false)
176GET_ERP_OFDM_MODE(ErpOfdmRate48Mbps, false)
177GET_ERP_OFDM_MODE(ErpOfdmRate54Mbps, false)
178#undef GET_ERP_OFDM_MODE
179
180WifiMode
181ErpOfdmPhy::CreateErpOfdmMode(std::string uniqueName, bool isMandatory)
182{
183 // Check whether uniqueName is in lookup table
184 const auto it = m_erpOfdmModulationLookupTable.find(uniqueName);
186 "ERP-OFDM mode cannot be created because it is not in the lookup table!");
187
188 return WifiModeFactory::CreateWifiMode(uniqueName,
190 isMandatory,
191 MakeBoundCallback(&GetCodeRate, uniqueName),
196}
197
199ErpOfdmPhy::GetCodeRate(const std::string& name)
200{
201 return m_erpOfdmModulationLookupTable.at(name).first;
202}
203
204uint16_t
205ErpOfdmPhy::GetConstellationSize(const std::string& name)
206{
207 return m_erpOfdmModulationLookupTable.at(name).second;
208}
209
210uint64_t
211ErpOfdmPhy::GetPhyRate(const std::string& name, uint16_t channelWidth)
212{
213 WifiCodeRate codeRate = GetCodeRate(name);
214 uint16_t constellationSize = GetConstellationSize(name);
215 uint64_t dataRate = OfdmPhy::CalculateDataRate(codeRate, constellationSize, channelWidth);
216 return OfdmPhy::CalculatePhyRate(codeRate, dataRate);
217}
218
219uint64_t
220ErpOfdmPhy::GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t /* staId */)
221{
222 return GetPhyRate(txVector.GetMode().GetUniqueName(), txVector.GetChannelWidth());
223}
224
225uint64_t
226ErpOfdmPhy::GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t /* staId */)
227{
228 return GetDataRate(txVector.GetMode().GetUniqueName(), txVector.GetChannelWidth());
229}
230
231uint64_t
232ErpOfdmPhy::GetDataRate(const std::string& name, uint16_t channelWidth)
233{
234 WifiCodeRate codeRate = GetCodeRate(name);
235 uint16_t constellationSize = GetConstellationSize(name);
236 return OfdmPhy::CalculateDataRate(codeRate, constellationSize, channelWidth);
237}
238
239bool
241{
242 return true;
243}
244
247{
248 return 4095;
249}
250
251} // namespace ns3
252
253namespace
254{
255
256/**
257 * Constructor class for ERP-OFDM modes
258 */
260{
261 public:
263 {
266 ns3::Create<ns3::ErpOfdmPhy>());
267 }
268} g_constructor_erp_ofdm; ///< the constructor for ERP-OFDM modes
269
270} // namespace
~ErpOfdmPhy() override
Destructor for ERP-OFDM PHY.
Definition: erp-ofdm-phy.cc:89
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:212
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
Time GetHeaderDuration(const WifiTxVector &txVector) const override
static void InitializeModes()
Initialize all ERP-OFDM modes.
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() 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 bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
static WifiMode GetErpOfdmRate6Mbps()
Return a WifiMode for ERP-OFDM at 6 Mbps.
ErpOfdmPhy()
Constructor for ERP-OFDM PHY.
Definition: erp-ofdm-phy.cc:77
static WifiMode GetErpOfdmRate18Mbps()
Return a WifiMode for ERP-OFDM at 18 Mbps.
static WifiMode GetErpOfdmRate24Mbps()
Return a WifiMode for ERP-OFDM at 24 Mbps.
static uint16_t GetConstellationSize(const std::string &name)
Return the constellation size from the ERP-OFDM mode's unique name using ModulationLookupTable.
static WifiMode GetErpOfdmRate12Mbps()
Return a WifiMode for ERP-OFDM at 12 Mbps.
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...
static WifiMode GetErpOfdmRate9Mbps()
Return a WifiMode for ERP-OFDM at 9 Mbps.
static WifiMode GetErpOfdmRate48Mbps()
Return a WifiMode for ERP-OFDM at 48 Mbps.
static WifiMode GetErpOfdmRate54Mbps()
Return a WifiMode for ERP-OFDM at 54 Mbps.
WifiMode GetHeaderMode(const WifiTxVector &txVector) const override
Definition: erp-ofdm-phy.cc:95
static WifiMode GetErpOfdmRate36Mbps()
Return a WifiMode for ERP-OFDM at 36 Mbps.
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:615
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:571
Ptr< WifiPhy > m_wifiPhy
Pointer to the owning WifiPhy.
Definition: phy-entity.h:981
std::map< std::string, CodeRateConstellationSizePair > ModulationLookupTable
A modulation lookup table using unique name of modulation as key.
Definition: phy-entity.h:571
std::list< WifiMode > m_modeList
the list of supported modes
Definition: phy-entity.h:985
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
static WifiMode CreateWifiMode(std::string uniqueName, WifiModulationClass modClass, bool isMandatory, CodeRateCallback codeRateCallback, ConstellationSizeCallback constellationSizeCallback, PhyRateCallback phyRateCallback, DataRateCallback dataRateCallback, AllowedCallback isAllowedCallback)
Definition: wifi-mode.cc:270
represent a single transmission mode
Definition: wifi-mode.h:51
std::string GetUniqueName() const
Definition: wifi-mode.cc:148
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:185
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:775
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
Definition: wifi-phy.cc:1055
Ptr< PhyEntity > GetLatestPhyEntity() const
Get the latest PHY entity supported by this PHY instance.
Definition: wifi-phy.cc:749
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() 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: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_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:49
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#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:767
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1343
@ WIFI_MOD_CLASS_ERP_OFDM
ERP-OFDM (18.4)
@ OFDM_PHY_DEFAULT
Definition: ofdm-phy.h:45
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.
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:706
const std::array< uint64_t, 8 > & GetErpOfdmRatesBpsList()
Get the array of possible ERP OFDM rates.
Definition: erp-ofdm-phy.cc:72
static const std::array< uint64_t, 8 > s_erpOfdmRatesBpsList
ERP OFDM rates in bits per second.
Definition: erp-ofdm-phy.cc:60
WifiCodeRate
These constants define the various convolutional coding rates used for the OFDM transmission modes in...
@ WIFI_CODE_RATE_2_3
2/3 coding rate
@ WIFI_CODE_RATE_1_2
1/2 coding rate
@ WIFI_CODE_RATE_3_4
3/4 coding rate