A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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 "ofdm-phy.h"
23
24#include "ofdm-ppdu.h"
25
26#include "ns3/interference-helper.h"
27#include "ns3/log.h"
28#include "ns3/simulator.h"
29#include "ns3/wifi-phy.h"
30#include "ns3/wifi-psdu.h"
31#include "ns3/wifi-utils.h"
32
33#include <array>
34
35#undef NS_LOG_APPEND_CONTEXT
36#define NS_LOG_APPEND_CONTEXT WIFI_PHY_NS_LOG_APPEND_CONTEXT(m_wifiPhy)
37
38namespace ns3
39{
40
42
43/*******************************************************
44 * OFDM PHY (IEEE 802.11-2016, clause 17)
45 *******************************************************/
46
47// clang-format off
48
53};
54
56 // Unique name Code rate Constellation size
57 { "OfdmRate6Mbps", { WIFI_CODE_RATE_1_2, 2 } }, // 20 MHz
58 { "OfdmRate9Mbps", { WIFI_CODE_RATE_3_4, 2 } }, // |
59 { "OfdmRate12Mbps", { WIFI_CODE_RATE_1_2, 4 } }, // V
60 { "OfdmRate18Mbps", { WIFI_CODE_RATE_3_4, 4 } },
61 { "OfdmRate24Mbps", { WIFI_CODE_RATE_1_2, 16 } },
62 { "OfdmRate36Mbps", { WIFI_CODE_RATE_3_4, 16 } },
63 { "OfdmRate48Mbps", { WIFI_CODE_RATE_2_3, 64 } },
64 { "OfdmRate54Mbps", { WIFI_CODE_RATE_3_4, 64 } },
65 { "OfdmRate3MbpsBW10MHz", { WIFI_CODE_RATE_1_2, 2 } }, // 10 MHz
66 { "OfdmRate4_5MbpsBW10MHz", { WIFI_CODE_RATE_3_4, 2 } }, // |
67 { "OfdmRate6MbpsBW10MHz", { WIFI_CODE_RATE_1_2, 4 } }, // V
68 { "OfdmRate9MbpsBW10MHz", { WIFI_CODE_RATE_3_4, 4 } },
69 { "OfdmRate12MbpsBW10MHz", { WIFI_CODE_RATE_1_2, 16 } },
70 { "OfdmRate18MbpsBW10MHz", { WIFI_CODE_RATE_3_4, 16 } },
71 { "OfdmRate24MbpsBW10MHz", { WIFI_CODE_RATE_2_3, 64 } },
72 { "OfdmRate27MbpsBW10MHz", { WIFI_CODE_RATE_3_4, 64 } },
73 { "OfdmRate1_5MbpsBW5MHz", { WIFI_CODE_RATE_1_2, 2 } }, // 5 MHz
74 { "OfdmRate2_25MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 2 } }, // |
75 { "OfdmRate3MbpsBW5MHz", { WIFI_CODE_RATE_1_2, 4 } }, // V
76 { "OfdmRate4_5MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 4 } },
77 { "OfdmRate6MbpsBW5MHz", { WIFI_CODE_RATE_1_2, 16 } },
78 { "OfdmRate9MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 16 } },
79 { "OfdmRate12MbpsBW5MHz", { WIFI_CODE_RATE_2_3, 64 } },
80 { "OfdmRate13_5MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 64 } }
81};
82
84const std::map<uint16_t, std::array<uint64_t, 8> > s_ofdmRatesBpsList =
85 {{ 20, // MHz
86 { 6000000, 9000000, 12000000, 18000000,
87 24000000, 36000000, 48000000, 54000000 }},
88 { 10, // MHz
89 { 3000000, 4500000, 6000000, 9000000,
90 12000000, 18000000, 24000000, 27000000 }},
91 { 5, // MHz
92 { 1500000, 2250000, 3000000, 4500000,
93 6000000, 9000000, 12000000, 13500000 }},
94};
95
96// clang-format on
97
103const std::map<uint16_t, std::array<uint64_t, 8>>&
105{
106 return s_ofdmRatesBpsList;
107}
108
109OfdmPhy::OfdmPhy(OfdmPhyVariant variant /* = OFDM_PHY_DEFAULT */, bool buildModeList /* = true */)
110{
111 NS_LOG_FUNCTION(this << variant << buildModeList);
112
113 if (buildModeList)
114 {
115 auto bwRatesMap = GetOfdmRatesBpsList();
116
117 switch (variant)
118 {
119 case OFDM_PHY_DEFAULT:
120 for (const auto& rate : bwRatesMap.at(20))
121 {
122 WifiMode mode = GetOfdmRate(rate, 20);
123 NS_LOG_LOGIC("Add " << mode << " to list");
124 m_modeList.emplace_back(mode);
125 }
126 break;
127 case OFDM_PHY_10_MHZ:
128 for (const auto& rate : bwRatesMap.at(10))
129 {
130 WifiMode mode = GetOfdmRate(rate, 10);
131 NS_LOG_LOGIC("Add " << mode << " to list");
132 m_modeList.emplace_back(mode);
133 }
134 break;
135 case OFDM_PHY_5_MHZ:
136 for (const auto& rate : bwRatesMap.at(5))
137 {
138 WifiMode mode = GetOfdmRate(rate, 5);
139 NS_LOG_LOGIC("Add " << mode << " to list");
140 m_modeList.emplace_back(mode);
141 }
142 break;
143 default:
144 NS_ABORT_MSG("Unsupported 11a OFDM variant");
145 }
146 }
147}
148
150{
151 NS_LOG_FUNCTION(this);
152}
153
155OfdmPhy::GetSigMode(WifiPpduField field, const WifiTxVector& txVector) const
156{
157 switch (field)
158 {
159 case WIFI_PPDU_FIELD_PREAMBLE: // consider header mode for preamble (useful for
160 // InterferenceHelper)
162 return GetHeaderMode(txVector);
163 default:
164 return PhyEntity::GetSigMode(field, txVector);
165 }
166}
167
170{
171 switch (txVector.GetChannelWidth())
172 {
173 case 5:
175 case 10:
177 case 20:
178 default:
179 // Section 17.3.2 "PPDU frame format"; IEEE Std 802.11-2016.
180 // Actually this is only the first part of the PhyHeader,
181 // because the last 16 bits of the PhyHeader are using the
182 // same mode of the payload
183 return GetOfdmRate6Mbps();
184 }
185}
186
189{
190 return m_ofdmPpduFormats;
191}
192
193Time
195{
196 switch (field)
197 {
199 return GetPreambleDuration(txVector); // L-STF + L-LTF
201 return GetHeaderDuration(txVector); // L-SIG
202 default:
203 return PhyEntity::GetDuration(field, txVector);
204 }
205}
206
207Time
209{
210 switch (txVector.GetChannelWidth())
211 {
212 case 20:
213 default:
214 // Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
215 // also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent
216 // parameters"; IEEE Std 802.11-2016
217 return MicroSeconds(16);
218 case 10:
219 // Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
220 // also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent
221 // parameters"; IEEE Std 802.11-2016
222 return MicroSeconds(32);
223 case 5:
224 // Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
225 // also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent
226 // parameters"; IEEE Std 802.11-2016
227 return MicroSeconds(64);
228 }
229}
230
231Time
233{
234 switch (txVector.GetChannelWidth())
235 {
236 case 20:
237 default:
238 // Section 17.3.3 "PHY preamble (SYNC)" and Figure 17-4 "OFDM training structure"; IEEE Std
239 // 802.11-2016 also Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related
240 // parameters"; IEEE Std 802.11-2016 We return the duration of the SIGNAL field only, since
241 // the SERVICE field (which strictly speaking belongs to the PHY header, see Section 17.3.2
242 // and Figure 17-1) is sent using the payload mode.
243 return MicroSeconds(4);
244 case 10:
245 // Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE
246 // Std 802.11-2016
247 return MicroSeconds(8);
248 case 5:
249 // Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE
250 // Std 802.11-2016
251 return MicroSeconds(16);
252 }
253}
254
255Time
257 const WifiTxVector& txVector,
258 WifiPhyBand band,
259 MpduType /* mpdutype */,
260 bool /* incFlag */,
261 uint32_t& /* totalAmpduSize */,
262 double& /* totalAmpduNumSymbols */,
263 uint16_t /* staId */) const
264{
265 //(Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std
266 // 802.11-2016 corresponds to T_{SYM} in the table)
267 Time symbolDuration = MicroSeconds(4);
268
269 double numDataBitsPerSymbol =
270 txVector.GetMode().GetDataRate(txVector) * symbolDuration.GetNanoSeconds() / 1e9;
271
272 // The number of OFDM symbols in the data field when BCC encoding
273 // is used is given in equation 19-32 of the IEEE 802.11-2016 standard.
274 double numSymbols =
275 lrint(ceil((GetNumberServiceBits() + size * 8.0 + 6.0) / (numDataBitsPerSymbol)));
276
277 Time payloadDuration =
278 FemtoSeconds(static_cast<uint64_t>(numSymbols * symbolDuration.GetFemtoSeconds()));
279 payloadDuration += GetSignalExtension(band);
280 return payloadDuration;
281}
282
283uint8_t
285{
286 return 16;
287}
288
289Time
291{
292 return (band == WIFI_PHY_BAND_2_4GHZ) ? MicroSeconds(6) : MicroSeconds(0);
293}
294
297 const WifiTxVector& txVector,
298 Time /* ppduDuration */)
299{
300 NS_LOG_FUNCTION(this << psdus << txVector);
301 return Create<OfdmPpdu>(
302 psdus.begin()->second,
303 txVector,
305 m_wifiPhy->GetLatestPhyEntity()->ObtainNextUid(
306 txVector)); // use latest PHY entity to handle MU-RTS sent with non-HT rate
307}
308
311{
312 NS_LOG_FUNCTION(this << field << *event);
314 {
315 return EndReceiveHeader(event); // L-SIG
316 }
317 return PhyEntity::DoEndReceiveField(field, event);
318}
319
322{
323 NS_LOG_FUNCTION(this << *event);
325 NS_LOG_DEBUG("L-SIG: SNR(dB)=" << RatioToDb(snrPer.snr) << ", PER=" << snrPer.per);
326 PhyFieldRxStatus status(GetRandomValue() > snrPer.per);
327 if (status.isSuccess)
328 {
329 NS_LOG_DEBUG("Received non-HT PHY header");
331 {
333 }
334 }
335 else
336 {
337 NS_LOG_DEBUG("Abort reception because non-HT PHY header reception failed");
338 status.reason = L_SIG_FAILURE;
339 status.actionIfFailure = ABORT;
340 }
341 return status;
342}
343
344bool
346{
347 uint16_t channelWidth = ppdu->GetTxVector().GetChannelWidth();
348 if ((channelWidth >= 40) && (channelWidth > m_wifiPhy->GetChannelWidth()))
349 {
350 NS_LOG_DEBUG("Packet reception could not be started because not enough channel width ("
351 << channelWidth << " vs " << m_wifiPhy->GetChannelWidth() << ")");
352 return false;
353 }
354 return true;
355}
356
357bool
359{
360 if (!IsChannelWidthSupported(ppdu))
361 {
362 return false;
363 }
364 return IsConfigSupported(ppdu);
365}
366
369{
370 const auto& txVector = ppdu->GetTxVector();
371 uint16_t centerFrequency = GetCenterFrequencyForChannelWidth(txVector);
372 uint16_t channelWidth = txVector.GetChannelWidth();
373 NS_LOG_FUNCTION(this << centerFrequency << channelWidth << txPowerW);
374 const auto& txMaskRejectionParams = GetTxMaskRejectionParams();
376 if (txVector.IsNonHtDuplicate())
377 {
379 centerFrequency,
380 channelWidth,
381 txPowerW,
382 GetGuardBandwidth(channelWidth),
383 std::get<0>(txMaskRejectionParams),
384 std::get<1>(txMaskRejectionParams),
385 std::get<2>(txMaskRejectionParams));
386 }
387 else
388 {
390 centerFrequency,
391 channelWidth,
392 txPowerW,
393 GetGuardBandwidth(channelWidth),
394 std::get<0>(txMaskRejectionParams),
395 std::get<1>(txMaskRejectionParams),
396 std::get<2>(txMaskRejectionParams));
397 }
398 return v;
399}
400
401void
403{
404 for (const auto& ratesPerBw : GetOfdmRatesBpsList())
405 {
406 for (const auto& rate : ratesPerBw.second)
407 {
408 GetOfdmRate(rate, ratesPerBw.first);
409 }
410 }
411}
412
414OfdmPhy::GetOfdmRate(uint64_t rate, uint16_t bw)
415{
416 switch (bw)
417 {
418 case 20:
419 switch (rate)
420 {
421 case 6000000:
422 return GetOfdmRate6Mbps();
423 case 9000000:
424 return GetOfdmRate9Mbps();
425 case 12000000:
426 return GetOfdmRate12Mbps();
427 case 18000000:
428 return GetOfdmRate18Mbps();
429 case 24000000:
430 return GetOfdmRate24Mbps();
431 case 36000000:
432 return GetOfdmRate36Mbps();
433 case 48000000:
434 return GetOfdmRate48Mbps();
435 case 54000000:
436 return GetOfdmRate54Mbps();
437 default:
438 NS_ABORT_MSG("Inexistent rate (" << rate << " bps) requested for 11a OFDM (default)");
439 return WifiMode();
440 }
441 break;
442 case 10:
443 switch (rate)
444 {
445 case 3000000:
447 case 4500000:
449 case 6000000:
451 case 9000000:
453 case 12000000:
455 case 18000000:
457 case 24000000:
459 case 27000000:
461 default:
462 NS_ABORT_MSG("Inexistent rate (" << rate << " bps) requested for 11a OFDM (10 MHz)");
463 return WifiMode();
464 }
465 break;
466 case 5:
467 switch (rate)
468 {
469 case 1500000:
471 case 2250000:
473 case 3000000:
474 return GetOfdmRate3MbpsBW5MHz();
475 case 4500000:
477 case 6000000:
478 return GetOfdmRate6MbpsBW5MHz();
479 case 9000000:
480 return GetOfdmRate9MbpsBW5MHz();
481 case 12000000:
483 case 13500000:
485 default:
486 NS_ABORT_MSG("Inexistent rate (" << rate << " bps) requested for 11a OFDM (5 MHz)");
487 return WifiMode();
488 }
489 break;
490 default:
491 NS_ABORT_MSG("Inexistent bandwidth (" << +bw << " MHz) requested for 11a OFDM");
492 return WifiMode();
493 }
494}
495
496#define GET_OFDM_MODE(x, f) \
497 WifiMode OfdmPhy::Get##x() \
498 { \
499 static WifiMode mode = CreateOfdmMode(#x, f); \
500 return mode; \
501 }
502
503// 20 MHz channel rates (default)
504GET_OFDM_MODE(OfdmRate6Mbps, true)
505GET_OFDM_MODE(OfdmRate9Mbps, false)
506GET_OFDM_MODE(OfdmRate12Mbps, true)
507GET_OFDM_MODE(OfdmRate18Mbps, false)
508GET_OFDM_MODE(OfdmRate24Mbps, true)
509GET_OFDM_MODE(OfdmRate36Mbps, false)
510GET_OFDM_MODE(OfdmRate48Mbps, false)
511GET_OFDM_MODE(OfdmRate54Mbps, false)
512// 10 MHz channel rates
513GET_OFDM_MODE(OfdmRate3MbpsBW10MHz, true)
514GET_OFDM_MODE(OfdmRate4_5MbpsBW10MHz, false)
515GET_OFDM_MODE(OfdmRate6MbpsBW10MHz, true)
516GET_OFDM_MODE(OfdmRate9MbpsBW10MHz, false)
517GET_OFDM_MODE(OfdmRate12MbpsBW10MHz, true)
518GET_OFDM_MODE(OfdmRate18MbpsBW10MHz, false)
519GET_OFDM_MODE(OfdmRate24MbpsBW10MHz, false)
520GET_OFDM_MODE(OfdmRate27MbpsBW10MHz, false)
521// 5 MHz channel rates
522GET_OFDM_MODE(OfdmRate1_5MbpsBW5MHz, true)
523GET_OFDM_MODE(OfdmRate2_25MbpsBW5MHz, false)
524GET_OFDM_MODE(OfdmRate3MbpsBW5MHz, true)
525GET_OFDM_MODE(OfdmRate4_5MbpsBW5MHz, false)
526GET_OFDM_MODE(OfdmRate6MbpsBW5MHz, true)
527GET_OFDM_MODE(OfdmRate9MbpsBW5MHz, false)
528GET_OFDM_MODE(OfdmRate12MbpsBW5MHz, false)
529GET_OFDM_MODE(OfdmRate13_5MbpsBW5MHz, false)
530#undef GET_OFDM_MODE
531
532WifiMode
533OfdmPhy::CreateOfdmMode(std::string uniqueName, bool isMandatory)
534{
535 // Check whether uniqueName is in lookup table
536 const auto it = m_ofdmModulationLookupTable.find(uniqueName);
538 "OFDM mode cannot be created because it is not in the lookup table!");
539
540 return WifiModeFactory::CreateWifiMode(uniqueName,
542 isMandatory,
543 MakeBoundCallback(&GetCodeRate, uniqueName),
548}
549
551OfdmPhy::GetCodeRate(const std::string& name)
552{
553 return m_ofdmModulationLookupTable.at(name).first;
554}
555
556uint16_t
557OfdmPhy::GetConstellationSize(const std::string& name)
558{
559 return m_ofdmModulationLookupTable.at(name).second;
560}
561
562uint64_t
563OfdmPhy::GetPhyRate(const std::string& name, uint16_t channelWidth)
564{
565 WifiCodeRate codeRate = GetCodeRate(name);
566 uint64_t dataRate = GetDataRate(name, channelWidth);
567 return CalculatePhyRate(codeRate, dataRate);
568}
569
570uint64_t
571OfdmPhy::CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate)
572{
573 return (dataRate / GetCodeRatio(codeRate));
574}
575
576uint64_t
577OfdmPhy::GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t /* staId */)
578{
579 return GetPhyRate(txVector.GetMode().GetUniqueName(), txVector.GetChannelWidth());
580}
581
582double
584{
585 switch (codeRate)
586 {
588 return (3.0 / 4.0);
590 return (2.0 / 3.0);
592 return (1.0 / 2.0);
594 default:
595 NS_FATAL_ERROR("trying to get code ratio for undefined coding rate");
596 return 0;
597 }
598}
599
600uint64_t
601OfdmPhy::GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t /* staId */)
602{
603 return GetDataRate(txVector.GetMode().GetUniqueName(), txVector.GetChannelWidth());
604}
605
606uint64_t
607OfdmPhy::GetDataRate(const std::string& name, uint16_t channelWidth)
608{
609 WifiCodeRate codeRate = GetCodeRate(name);
610 uint16_t constellationSize = GetConstellationSize(name);
611 return CalculateDataRate(codeRate, constellationSize, channelWidth);
612}
613
614uint64_t
615OfdmPhy::CalculateDataRate(WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth)
616{
617 return CalculateDataRate(GetSymbolDuration(channelWidth),
619 static_cast<uint16_t>(log2(constellationSize)),
620 GetCodeRatio(codeRate));
621}
622
623uint64_t
625 uint16_t usableSubCarriers,
626 uint16_t numberOfBitsPerSubcarrier,
627 double codingRate)
628{
629 double symbolRate = (1e9 / static_cast<double>(symbolDuration.GetNanoSeconds()));
630 return lrint(ceil(symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
631}
632
633uint16_t
635{
636 return 48;
637}
638
639Time
640OfdmPhy::GetSymbolDuration(uint16_t channelWidth)
641{
642 Time symbolDuration = MicroSeconds(4);
643 uint8_t bwFactor = 1;
644 if (channelWidth == 10)
645 {
646 bwFactor = 2;
647 }
648 else if (channelWidth == 5)
649 {
650 bwFactor = 4;
651 }
652 return bwFactor * symbolDuration;
653}
654
655bool
657{
658 return true;
659}
660
663{
664 return 4095;
665}
666
667uint16_t
669{
670 if (!ppdu)
671 {
672 return 20;
673 }
674 return GetRxChannelWidth(ppdu->GetTxVector());
675}
676
677double
679{
680 if (ppdu && ppdu->GetTxVector().GetChannelWidth() < 20)
681 {
682 // scale CCA sensitivity threshold for BW of 5 and 10 MHz
683 uint16_t bw = GetRxChannelWidth(ppdu->GetTxVector());
684 double thresholdW = DbmToW(m_wifiPhy->GetCcaSensitivityThreshold()) * (bw / 20.0);
685 return WToDbm(thresholdW);
686 }
687 return PhyEntity::GetCcaThreshold(ppdu, channelType);
688}
689
692{
693 const auto txWidth = ppdu->GetTxChannelWidth();
694 const auto& txVector = ppdu->GetTxVector();
695 // Update channel width in TXVECTOR for non-HT duplicate PPDUs.
696 if (txVector.IsNonHtDuplicate() && txWidth > m_wifiPhy->GetChannelWidth())
697 {
698 // We also do a copy of the PPDU for non-HT duplicate PPDUs since other
699 // PHYs might set a different channel width in the reconstructed TXVECTOR.
700 auto rxPpdu = ppdu->Copy();
701 auto updatedTxVector = txVector;
702 updatedTxVector.SetChannelWidth(std::min(txWidth, m_wifiPhy->GetChannelWidth()));
703 rxPpdu->UpdateTxVector(updatedTxVector);
704 return rxPpdu;
705 }
707}
708
709} // namespace ns3
710
711namespace
712{
713
718{
719 public:
721 {
724 ns3::Create<ns3::OfdmPhy>()); // default variant will do
725 }
727
728} // namespace
Constructor class for OFDM modes.
Definition: ofdm-phy.cc:718
static WifiMode GetOfdmRate6Mbps()
Return a WifiMode for OFDM at 6 Mbps.
uint32_t GetMaxPsduSize() const override
Get the maximum PSDU size in bytes.
Definition: ofdm-phy.cc:662
~OfdmPhy() override
Destructor for OFDM PHY.
Definition: ofdm-phy.cc:149
static WifiMode GetOfdmRate13_5MbpsBW5MHz()
Return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing.
static WifiMode GetOfdmRate48Mbps()
Return a WifiMode for OFDM at 48 Mbps.
static const PpduFormats m_ofdmPpduFormats
OFDM PPDU formats.
Definition: ofdm-phy.h:452
static uint16_t GetConstellationSize(const std::string &name)
Return the constellation size from the OFDM mode's unique name using ModulationLookupTable.
Definition: ofdm-phy.cc:557
static WifiMode GetOfdmRate54Mbps()
Return a WifiMode for OFDM at 54 Mbps.
uint8_t GetNumberServiceBits() const
Definition: ofdm-phy.cc:284
static WifiCodeRate GetCodeRate(const std::string &name)
Return the WifiCodeRate from the OFDM mode's unique name using ModulationLookupTable.
Definition: ofdm-phy.cc:551
double GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const override
Return the CCA threshold in dBm for a given channel type.
Definition: ofdm-phy.cc:678
static uint64_t GetPhyRateFromTxVector(const WifiTxVector &txVector, uint16_t staId)
Return the PHY rate corresponding to the supplied TXVECTOR.
Definition: ofdm-phy.cc:577
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 WifiMode GetOfdmRate36Mbps()
Return a WifiMode for OFDM at 36 Mbps.
static WifiMode GetOfdmRate3MbpsBW10MHz()
Return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing.
static void InitializeModes()
Initialize all OFDM modes (for all variants).
Definition: ofdm-phy.cc:402
virtual bool IsAllConfigSupported(WifiPpduField field, Ptr< const WifiPpdu > ppdu) const
Checks if the signaled configuration (including bandwidth) is supported by the PHY.
Definition: ofdm-phy.cc:358
PhyFieldRxStatus EndReceiveHeader(Ptr< Event > event)
End receiving the header, perform OFDM-specific actions, and provide the status of the reception.
Definition: ofdm-phy.cc:321
static WifiMode GetOfdmRate2_25MbpsBW5MHz()
Return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing.
const PpduFormats & GetPpduFormats() const override
Return the PPDU formats of the PHY.
Definition: ofdm-phy.cc:188
static bool IsAllowed(const WifiTxVector &txVector)
Check whether the combination in TXVECTOR is allowed.
Definition: ofdm-phy.cc:656
static WifiMode GetOfdmRate6MbpsBW5MHz()
Return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing.
OfdmPhy(OfdmPhyVariant variant=OFDM_PHY_DEFAULT, bool buildModeList=true)
Constructor for OFDM PHY.
Definition: ofdm-phy.cc:109
static uint64_t GetDataRateFromTxVector(const WifiTxVector &txVector, uint16_t staId)
Return the data rate corresponding to the supplied TXVECTOR.
Definition: ofdm-phy.cc:601
static WifiMode GetOfdmRate1_5MbpsBW5MHz()
Return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing.
static WifiMode GetOfdmRate18MbpsBW10MHz()
Return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing.
static Time GetSymbolDuration(uint16_t channelWidth)
Definition: ofdm-phy.cc:640
static uint64_t GetPhyRate(const std::string &name, uint16_t channelWidth)
Return the PHY rate from the OFDM mode's unique name and the supplied parameters.
Definition: ofdm-phy.cc:563
static WifiMode GetOfdmRate12MbpsBW10MHz()
Return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing.
static uint16_t GetUsableSubcarriers()
Definition: ofdm-phy.cc:634
static WifiMode GetOfdmRate9MbpsBW10MHz()
Return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing.
static WifiMode GetOfdmRate4_5MbpsBW5MHz()
Return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing.
static WifiMode GetOfdmRate3MbpsBW5MHz()
Return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing.
virtual Time GetPreambleDuration(const WifiTxVector &txVector) const
Definition: ofdm-phy.cc:208
Ptr< const WifiPpdu > GetRxPpduFromTxPpdu(Ptr< const WifiPpdu > ppdu) override
The WifiPpdu from the TX PHY is received by each RX PHY attached to the same channel.
Definition: ofdm-phy.cc:691
static WifiMode GetOfdmRate(uint64_t rate, uint16_t bw=20)
Return a WifiMode for OFDM corresponding to the provided rate and the channel bandwidth (20,...
Definition: ofdm-phy.cc:414
static WifiMode GetOfdmRate27MbpsBW10MHz()
Return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing.
static WifiMode GetOfdmRate9MbpsBW5MHz()
Return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing.
Ptr< WifiPpdu > BuildPpdu(const WifiConstPsduMap &psdus, const WifiTxVector &txVector, Time ppduDuration) override
Build amendment-specific PPDU.
Definition: ofdm-phy.cc:296
static WifiMode GetOfdmRate12Mbps()
Return a WifiMode for OFDM at 12Mbps.
static WifiMode CreateOfdmMode(std::string uniqueName, bool isMandatory)
Create an OFDM mode from a unique name, the unique name must already be contained inside ModulationLo...
Definition: ofdm-phy.cc:533
uint16_t GetMeasurementChannelWidth(const Ptr< const WifiPpdu > ppdu) const override
Return the channel width used to measure the RSSI.
Definition: ofdm-phy.cc:668
static WifiMode GetOfdmRate24MbpsBW10MHz()
Return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing.
static WifiMode GetOfdmRate18Mbps()
Return a WifiMode for OFDM at 18 Mbps.
Ptr< SpectrumValue > GetTxPowerSpectralDensity(double txPowerW, Ptr< const WifiPpdu > ppdu) const override
Definition: ofdm-phy.cc:368
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
static WifiMode GetOfdmRate6MbpsBW10MHz()
Return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing.
static WifiMode GetOfdmRate24Mbps()
Return a WifiMode for OFDM at 24 Mbps.
Time GetDuration(WifiPpduField field, const WifiTxVector &txVector) const override
Get the duration of the PPDU field (or group of fields) used by this entity for the given transmissio...
Definition: ofdm-phy.cc:194
PhyFieldRxStatus DoEndReceiveField(WifiPpduField field, Ptr< Event > event) override
End receiving a given field, perform amendment-specific actions, and provide the status of the recept...
Definition: ofdm-phy.cc:310
virtual Time GetHeaderDuration(const WifiTxVector &txVector) const
Definition: ofdm-phy.cc:232
virtual WifiMode GetHeaderMode(const WifiTxVector &txVector) const
Definition: ofdm-phy.cc:169
WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const override
Get the WifiMode for the SIG field specified by the PPDU field.
Definition: ofdm-phy.cc:155
static WifiMode GetOfdmRate12MbpsBW5MHz()
Return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing.
static const ModulationLookupTable m_ofdmModulationLookupTable
lookup table to retrieve code rate and constellation size corresponding to a unique name of modulatio...
Definition: ofdm-phy.h:455
static uint64_t GetDataRate(const std::string &name, uint16_t channelWidth)
Return the data rate from the OFDM mode's unique name and the supplied parameters.
Definition: ofdm-phy.cc:607
static WifiMode GetOfdmRate4_5MbpsBW10MHz()
Return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing.
static WifiMode GetOfdmRate9Mbps()
Return a WifiMode for OFDM at 9 Mbps.
virtual bool IsChannelWidthSupported(Ptr< const WifiPpdu > ppdu) const
Checks if the PPDU's bandwidth is supported by the PHY.
Definition: ofdm-phy.cc:345
static double GetCodeRatio(WifiCodeRate codeRate)
Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
Definition: ofdm-phy.cc:583
Time GetSignalExtension(WifiPhyBand band) const
Definition: ofdm-phy.cc:290
Time GetPayloadDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, MpduType mpdutype, bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols, uint16_t staId) const override
Definition: ofdm-phy.cc:256
virtual Time GetDuration(WifiPpduField field, const WifiTxVector &txVector) const
Get the duration of the PPDU field (or group of fields) used by this entity for the given transmissio...
Definition: phy-entity.cc:193
std::tuple< double, double, double > GetTxMaskRejectionParams() const
Definition: phy-entity.cc:1352
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
virtual double GetCcaThreshold(const Ptr< const WifiPpdu > ppdu, WifiChannelListType channelType) const
Return the CCA threshold in dBm for a given channel type.
Definition: phy-entity.cc:1223
std::map< WifiPreamble, std::vector< WifiPpduField > > PpduFormats
A map of PPDU field elements per preamble type.
Definition: phy-entity.h:561
virtual WifiMode GetSigMode(WifiPpduField field, const WifiTxVector &txVector) const
Get the WifiMode for the SIG field specified by the PPDU field.
Definition: phy-entity.cc:153
virtual uint16_t GetRxChannelWidth(const WifiTxVector &txVector) const
Return the channel width used in the reception spectrum model.
Definition: phy-entity.cc:1217
uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const
Definition: phy-entity.cc:1346
std::list< WifiMode > m_modeList
the list of supported modes
Definition: phy-entity.h:985
double GetRandomValue() const
Obtain a random value from the WifiPhy's generator.
Definition: phy-entity.cc:1180
SnrPer GetPhyHeaderSnrPer(WifiPpduField field, Ptr< Event > event) const
Obtain the SNR and PER of the PPDU field from the WifiPhy's InterferenceHelper class.
Definition: phy-entity.cc:271
virtual Ptr< const WifiPpdu > GetRxPpduFromTxPpdu(Ptr< const WifiPpdu > ppdu)
The WifiPpdu from the TX PHY is received by each RX PHY attached to the same channel.
Definition: phy-entity.cc:1389
uint16_t GetCenterFrequencyForChannelWidth(const WifiTxVector &txVector) const
Get the center frequency of the channel corresponding the current TxVector rather than that of the su...
Definition: phy-entity.cc:1297
virtual bool IsConfigSupported(Ptr< const WifiPpdu > ppdu) const
Checks if the signaled configuration (excluding bandwidth) is supported by the PHY.
Definition: phy-entity.cc:1090
@ DROP
drop PPDU and set CCA_BUSY
Definition: phy-entity.h:103
@ ABORT
abort reception of PPDU
Definition: phy-entity.h:104
virtual PhyFieldRxStatus DoEndReceiveField(WifiPpduField field, Ptr< Event > event)
End receiving a given field, perform amendment-specific actions, and provide the status of the recept...
Definition: phy-entity.cc:388
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
int64_t GetNanoSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:418
int64_t GetFemtoSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:428
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
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:122
uint16_t GetChannelWidth() const
Definition: wifi-phy.cc:1069
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:771
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
Definition: wifi-phy.cc:1051
double GetCcaSensitivityThreshold() const
Return the CCA sensitivity threshold (dBm).
Definition: wifi-phy.cc:516
Ptr< PhyEntity > GetLatestPhyEntity() const
Get the latest PHY entity supported by this PHY instance.
Definition: wifi-phy.cc:745
static Ptr< SpectrumValue > CreateDuplicated20MhzTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40, const std::vector< bool > &puncturedSubchannels=std::vector< bool >{})
Create a transmit power spectral density corresponding to OFDM duplicated over multiple 20 MHz subcha...
static Ptr< SpectrumValue > CreateOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40)
Create a transmit power spectral density corresponding to OFDM (802.11a/g).
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 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_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#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_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#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:765
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1350
Time FemtoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1386
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:33
OfdmPhyVariant
The OFDM (11a) PHY variants.
Definition: ofdm-phy.h:44
WifiChannelListType
Enumeration of the possible channel-list parameter elements defined in Table 8-5 of IEEE 802....
WifiPpduField
The type of PPDU field (grouped for convenience)
MpduType
The type of an MPDU.
@ UNSUPPORTED_SETTINGS
@ L_SIG_FAILURE
@ WIFI_PREAMBLE_LONG
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
Definition: wifi-phy-band.h:35
@ WIFI_MOD_CLASS_OFDM
OFDM (Clause 17)
@ OFDM_PHY_10_MHZ
Definition: ofdm-phy.h:46
@ OFDM_PHY_DEFAULT
Definition: ofdm-phy.h:45
@ OFDM_PHY_5_MHZ
Definition: ofdm-phy.h:47
@ WIFI_PPDU_FIELD_NON_HT_HEADER
PHY header field for DSSS or ERP, short PHY header field for HR/DSSS or ERP, field not present for HT...
@ WIFI_PPDU_FIELD_PREAMBLE
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP,...
@ WIFI_PPDU_FIELD_DATA
data field
class anonymous_namespace{ofdm-phy.cc}::ConstructorOfdm g_constructor_ofdm
the constructor for OFDM modes
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double RatioToDb(double ratio)
Convert from ratio to dB.
Definition: wifi-utils.cc:52
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
double WToDbm(double w)
Convert from Watts to dBm.
Definition: wifi-utils.cc:46
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:704
const std::map< uint16_t, std::array< uint64_t, 8 > > s_ofdmRatesBpsList
OFDM rates in bits per second for each bandwidth (MHz)
Definition: ofdm-phy.cc:84
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:40
const std::map< uint16_t, std::array< uint64_t, 8 > > & GetOfdmRatesBpsList()
Get the array of possible OFDM rates for each bandwidth (MHz).
Definition: ofdm-phy.cc:104
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
@ WIFI_CODE_RATE_UNDEFINED
undefined coding rate
#define GET_OFDM_MODE(x, f)
Definition: ofdm-phy.cc:496
Declaration of ns3::OfdmPhy class and ns3::OfdmPhyVariant enum.
Declaration of ns3::OfdmPpdu class.
Status of the reception of the PPDU field.
Definition: phy-entity.h:112
WifiPhyRxfailureReason reason
failure reason
Definition: phy-entity.h:114
PhyRxFailureAction actionIfFailure
action to perform in case of failure
Definition: phy-entity.h:115
bool isSuccess
outcome (true if success) of the reception
Definition: phy-entity.h:113
A struct for both SNR and PER.
Definition: phy-entity.h:147
double snr
SNR in linear scale.
Definition: phy-entity.h:148