A Discrete-Event Network Simulator
API
he-ppdu.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  * Author: Rediet <getachew.redieteab@orange.com>
19  * Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
20  * S├ębastien Deronne <sebastien.deronne@gmail.com> (HeSigHeader)
21  */
22 
23 #include "ns3/wifi-phy.h"
24 #include "ns3/wifi-psdu.h"
25 #include "ns3/wifi-utils.h"
26 #include "he-phy.h"
27 #include "he-ppdu.h"
28 #include "ns3/log.h"
29 
30 namespace ns3 {
31 
32 NS_LOG_COMPONENT_DEFINE ("HePpdu");
33 
34 std::ostream& operator<< (std::ostream& os, const HePpdu::TxPsdFlag &flag)
35 {
36  switch (flag)
37  {
39  return (os << "PSD_NON_HE_TB");
41  return (os << "PSD_HE_TB_NON_OFDMA_PORTION");
43  return (os << "PSD_HE_TB_OFDMA_PORTION");
44  default:
45  NS_FATAL_ERROR ("Invalid PSD flag");
46  return (os << "INVALID");
47  }
48 }
49 
50 HePpdu::HePpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration,
51  WifiPhyBand band, uint64_t uid, TxPsdFlag flag)
52  : OfdmPpdu (psdus.begin ()->second, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
53 {
54  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration << band << uid << flag);
55 
56  //overwrite with map (since only first element used by OfdmPpdu)
57  m_psdus.begin ()->second = 0;
58  m_psdus.clear ();
59  m_psdus = psdus;
60  if (IsMu ())
61  {
62  m_muUserInfos = txVector.GetHeMuUserInfoMap ();
63  }
64 
65  SetPhyHeaders (txVector, ppduDuration);
66  SetTxPsdFlag (flag);
67 }
68 
69 HePpdu::HePpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
70  WifiPhyBand band, uint64_t uid)
71  : OfdmPpdu (psdu, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
72 {
73  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << band << uid);
74  NS_ASSERT (!IsMu ());
75  SetPhyHeaders (txVector, ppduDuration);
77 }
78 
80 {
81 }
82 
83 void
84 HePpdu::SetPhyHeaders (const WifiTxVector& txVector, Time ppduDuration)
85 {
86  NS_LOG_FUNCTION (this << txVector << ppduDuration);
87  uint8_t sigExtension = 0;
89  {
90  sigExtension = 6;
91  }
92  uint8_t m = 0;
94  {
95  m = 2;
96  }
97  else if (m_preamble == WIFI_PREAMBLE_HE_MU)
98  {
99  m = 1;
100  }
101  else
102  {
103  NS_ASSERT_MSG (false, "Unsupported preamble type");
104  }
105  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
106  m_lSig.SetLength (length);
107  if (IsDlMu ())
108  {
109  m_heSig.SetMuFlag (true);
110  }
111  else if (!IsUlMu ())
112  {
113  m_heSig.SetMcs (txVector.GetMode ().GetMcsValue ());
114  m_heSig.SetNStreams (txVector.GetNss ());
115  }
116  m_heSig.SetBssColor (txVector.GetBssColor ());
118  m_heSig.SetGuardIntervalAndLtfSize (txVector.GetGuardInterval (), 2/*NLTF currently unused*/);
119 }
120 
123 {
124  WifiTxVector txVector;
125  txVector.SetPreambleType (m_preamble);
126  txVector.SetMode (HePhy::GetHeMcs (m_heSig.GetMcs ()));
128  txVector.SetNss (m_heSig.GetNStreams ());
130  txVector.SetBssColor (m_heSig.GetBssColor ());
131  txVector.SetAggregation (m_psdus.size () > 1 || m_psdus.begin ()->second->IsAggregate ());
132  for (auto const& muUserInfo : m_muUserInfos)
133  {
134  txVector.SetHeMuUserInfo (muUserInfo.first, muUserInfo.second);
135  }
136  return txVector;
137 }
138 
139 Time
141 {
142  Time ppduDuration = Seconds (0);
143  const WifiTxVector& txVector = GetTxVector ();
144  Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
145  Time preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
146  uint8_t sigExtension = 0;
148  {
149  sigExtension = 6;
150  }
151  uint8_t m = IsDlMu () ? 1 : 2;
152  //Equation 27-11 of IEEE P802.11ax/D4.0
153  Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (m_lSig.GetLength () + 3 + m) / 3)) * 4) + 20 + sigExtension);
154  uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
155  ppduDuration = preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
156  return ppduDuration;
157 }
158 
160 HePpdu::Copy (void) const
161 {
162  return Create<HePpdu> (m_psdus, GetTxVector (), GetTxDuration (), m_band, m_uid, m_txPsdFlag);
163 }
164 
166 HePpdu::GetType (void) const
167 {
168  switch (m_preamble)
169  {
170  case WIFI_PREAMBLE_HE_MU:
171  return WIFI_PPDU_TYPE_DL_MU;
172  case WIFI_PREAMBLE_HE_TB:
173  return WIFI_PPDU_TYPE_UL_MU;
174  default:
175  return WIFI_PPDU_TYPE_SU;
176  }
177 }
178 
179 bool
180 HePpdu::IsMu (void) const
181 {
182  return (IsDlMu () || IsUlMu ());
183 }
184 
185 bool
186 HePpdu::IsDlMu (void) const
187 {
188  return (m_preamble == WIFI_PREAMBLE_HE_MU);
189 }
190 
191 bool
192 HePpdu::IsUlMu (void) const
193 {
194  return (m_preamble == WIFI_PREAMBLE_HE_TB);
195 }
196 
198 HePpdu::GetPsdu (uint8_t bssColor, uint16_t staId /* = SU_STA_ID */) const
199 {
200  if (!IsMu ())
201  {
202  NS_ASSERT (m_psdus.size () == 1);
203  return m_psdus.at (SU_STA_ID);
204  }
205  else if (IsUlMu ())
206  {
207  NS_ASSERT (m_psdus.size () == 1);
208  if (bssColor == 0 || m_heSig.GetBssColor () == 0 || (bssColor == m_heSig.GetBssColor ()))
209  {
210  return m_psdus.begin ()->second;
211  }
212  }
213  else
214  {
215  if (bssColor == 0 || m_heSig.GetBssColor () == 0 || (bssColor == m_heSig.GetBssColor ()))
216  {
217  auto it = m_psdus.find (staId);
218  if (it != m_psdus.end ())
219  {
220  return it->second;
221  }
222  }
223  }
224  return nullptr;
225 }
226 
227 uint16_t
228 HePpdu::GetStaId (void) const
229 {
230  NS_ASSERT (IsUlMu ());
231  return m_psdus.begin ()->first;
232 }
233 
236 {
237  return m_txPsdFlag;
238 }
239 
240 void
242 {
243  NS_LOG_FUNCTION (this << flag);
244  NS_ASSERT ((IsUlMu () && flag > PSD_NON_HE_TB) || (!IsUlMu () && flag == PSD_NON_HE_TB));
245  m_txPsdFlag = flag;
246 }
247 
248 std::string
250 {
251  std::ostringstream ss;
252  if (IsMu ())
253  {
254  ss << m_psdus;
255  ss << ", " << m_txPsdFlag;
256  }
257  else
258  {
259  ss << "PSDU=" << m_psdus.at (SU_STA_ID) << " ";
260  }
261  return ss.str ();
262 }
263 
265  : m_format (1),
266  m_bssColor (0),
267  m_ul_dl (0),
268  m_mcs (0),
269  m_spatialReuse (0),
270  m_bandwidth (0),
271  m_gi_ltf_size (0),
272  m_nsts (0),
273  m_mu (false)
274 {
275 }
276 
278 {
279 }
280 
281 TypeId
283 {
284  static TypeId tid = TypeId ("ns3::HeSigHeader")
285  .SetParent<Header> ()
286  .SetGroupName ("Wifi")
287  .AddConstructor<HeSigHeader> ()
288  ;
289  return tid;
290 }
291 
292 TypeId
294 {
295  return GetTypeId ();
296 }
297 
298 void
299 HePpdu::HeSigHeader::Print (std::ostream &os) const
300 {
301  os << "MCS=" << +m_mcs
302  << " CHANNEL_WIDTH=" << GetChannelWidth ()
303  << " GI=" << GetGuardInterval ()
304  << " NSTS=" << +m_nsts
305  << " BSSColor=" << +m_bssColor
306  << " MU=" << +m_mu;
307 }
308 
309 uint32_t
311 {
312  uint32_t size = 0;
313  size += 4; //HE-SIG-A1
314  size += 4; //HE-SIG-A2
315  if (m_mu)
316  {
317  size += 1; //HE-SIG-B
318  }
319  return size;
320 }
321 
322 void
324 {
325  m_mu = mu;
326 }
327 
328 void
330 {
331  NS_ASSERT (mcs <= 11);
332  m_mcs = mcs;
333 }
334 
335 uint8_t
337 {
338  return m_mcs;
339 }
340 
341 void
343 {
344  NS_ASSERT (bssColor < 64);
345  m_bssColor = bssColor;
346 }
347 
348 uint8_t
350 {
351  return m_bssColor;
352 }
353 
354 void
356 {
357  if (channelWidth == 160)
358  {
359  m_bandwidth = 3;
360  }
361  else if (channelWidth == 80)
362  {
363  m_bandwidth = 2;
364  }
365  else if (channelWidth == 40)
366  {
367  m_bandwidth = 1;
368  }
369  else
370  {
371  m_bandwidth = 0;
372  }
373 }
374 
375 uint16_t
377 {
378  if (m_bandwidth == 3)
379  {
380  return 160;
381  }
382  else if (m_bandwidth == 2)
383  {
384  return 80;
385  }
386  else if (m_bandwidth == 1)
387  {
388  return 40;
389  }
390  else
391  {
392  return 20;
393  }
394 }
395 
396 void
398 {
399  if (gi == 800 && ltf == 1)
400  {
401  m_gi_ltf_size = 0;
402  }
403  else if (gi == 800 && ltf == 2)
404  {
405  m_gi_ltf_size = 1;
406  }
407  else if (gi == 1600 && ltf == 2)
408  {
409  m_gi_ltf_size = 2;
410  }
411  else
412  {
413  m_gi_ltf_size = 3;
414  }
415 }
416 
417 uint16_t
419 {
420  if (m_gi_ltf_size == 3)
421  {
422  //we currently do not consider DCM nor STBC fields
423  return 3200;
424  }
425  else if (m_gi_ltf_size == 2)
426  {
427  return 1600;
428  }
429  else
430  {
431  return 800;
432  }
433 }
434 
435 void
437 {
438  NS_ASSERT (nStreams <= 8);
439  m_nsts = (nStreams - 1);
440 }
441 
442 uint8_t
444 {
445  return (m_nsts + 1);
446 }
447 
448 void
450 {
451  //HE-SIG-A1
452  uint8_t byte = m_format & 0x01;
453  byte |= ((m_ul_dl & 0x01) << 2);
454  byte |= ((m_mcs & 0x0f) << 3);
455  start.WriteU8 (byte);
456  uint16_t bytes = (m_bssColor & 0x3f);
457  bytes |= (0x01 << 6); //Reserved set to 1
458  bytes |= ((m_spatialReuse & 0x0f) << 7);
459  bytes |= ((m_bandwidth & 0x03) << 11);
460  bytes |= ((m_gi_ltf_size & 0x03) << 13);
461  bytes |= ((m_nsts & 0x01) << 15);
462  start.WriteU16 (bytes);
463  start.WriteU8 ((m_nsts >> 1) & 0x03);
464 
465  //HE-SIG-A2
466  uint32_t sigA2 = 0;
467  sigA2 |= (0x01 << 14); //Set Reserved bit #14 to 1
468  start.WriteU32 (sigA2);
469 
470  if (m_mu)
471  {
472  //HE-SIG-B
473  start.WriteU8 (0);
474  }
475 }
476 
477 uint32_t
479 {
481 
482  //HE-SIG-A1
483  uint8_t byte = i.ReadU8 ();
484  m_format = (byte & 0x01);
485  m_ul_dl = ((byte >> 2) & 0x01);
486  m_mcs = ((byte >> 3) & 0x0f);
487  uint16_t bytes = i.ReadU16 ();
488  m_bssColor = (bytes & 0x3f);
489  m_spatialReuse = ((bytes >> 7) & 0x0f);
490  m_bandwidth = ((bytes >> 11) & 0x03);
491  m_gi_ltf_size = ((bytes >> 13) & 0x03);
492  m_nsts = ((bytes >> 15) & 0x01);
493  byte = i.ReadU8 ();
494  m_nsts |= (byte & 0x03) << 1;
495 
496  //HE-SIG-A2
497  i.ReadU32 ();
498 
499  if (m_mu)
500  {
501  //HE-SIG-B
502  i.ReadU8 ();
503  }
504 
505  return i.GetDistanceFrom (start);
506 }
507 
508 } //namespace ns3
uint16_t ReadU16(void)
Definition: buffer.h:1029
Protocol header serialization and deserialization.
Definition: header.h:42
void SetChannelWidth(uint16_t channelWidth)
Fill the channel width field of HE-SIG-A1 (in MHz).
Definition: he-ppdu.cc:355
Ptr< WifiPpdu > Copy(void) const override
Copy this instance.
Definition: he-ppdu.cc:160
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
HeSigHeader m_heSig
the HE-SIG PHY header
Definition: he-ppdu.h:259
uint32_t ReadU32(void)
Definition: buffer.cc:972
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetBssColor(uint8_t bssColor)
Fill the BSS Color field of HE-SIG-A1.
Definition: he-ppdu.cc:342
Definition: second.py:1
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
Ptr< const WifiPsdu > GetPsdu(void) const
Get the payload of the PPDU.
Definition: wifi-ppdu.cc:79
void SetBssColor(uint8_t color)
Set the BSS color.
uint16_t GetLength(void) const
Return the LENGTH field of L-SIG (in bytes).
Definition: ofdm-ppdu.cc:225
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Definition: wifi-ppdu.h:38
void SetNStreams(uint8_t nStreams)
Fill the number of streams field of HE-SIG-A1.
Definition: he-ppdu.cc:436
def start()
Definition: core.py:1855
void SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf)
Fill the GI + LTF size field of HE-SIG-A1.
Definition: he-ppdu.cc:397
LSigHeader m_lSig
the L-SIG PHY header
Definition: ofdm-ppdu.h:130
WifiTxVector GetTxVector(void) const
Get the TXVECTOR used to send the PPDU.
Definition: wifi-ppdu.cc:63
#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
uint64_t m_uid
the unique ID of this PPDU
Definition: wifi-ppdu.h:160
TxPsdFlag m_txPsdFlag
the transmit power spectral density flag
Definition: he-ppdu.h:260
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
uint32_t Deserialize(Buffer::Iterator start)
Definition: he-ppdu.cc:478
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
uint16_t GetGuardInterval(void) const
uint8_t GetNss(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the number of spatial streams.
WifiTxVector::HeMuUserInfoMap m_muUserInfos
the HE MU specific per-user information (to be removed once HE-SIG-B headers are implemented) ...
Definition: he-ppdu.h:245
static WifiMode GetHeMcs(uint8_t index)
Return the HE MCS corresponding to the provided index.
Definition: he-phy.cc:983
uint8_t GetBssColor(void) const
Return the BSS Color field in the HE-SIG-A1.
Definition: he-ppdu.cc:349
void SetTxPsdFlag(TxPsdFlag flag)
Definition: he-ppdu.cc:241
WifiPhyBand m_band
the WifiPhyBand used to transmit that PPDU
Definition: ofdm-ppdu.h:128
void SetPhyHeaders(const WifiTxVector &txVector, Time ppduDuration)
Fill in the HE PHY headers.
Definition: he-ppdu.cc:84
iterator in a Buffer instance
Definition: buffer.h:98
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...
uint32_t GetDistanceFrom(Iterator const &o) const
Definition: buffer.cc:783
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
Time GetTxDuration(void) const override
Get the total transmission duration of the PPDU.
Definition: he-ppdu.cc:140
void Print(std::ostream &os) const
Definition: he-ppdu.cc:299
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1313
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSD for HE TB PPDU non-OFDMA...
Definition: he-ppdu.h:159
WifiPreamble m_preamble
the PHY preamble
Definition: wifi-ppdu.h:157
WifiPpduType GetType(void) const override
Return the PPDU type (.
Definition: he-ppdu.cc:166
uint8_t GetNStreams(void) const
Return the number of streams.
Definition: he-ppdu.cc:443
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
void SetNss(uint8_t nss)
Sets the number of Nss.
virtual ~HePpdu()
Destructor for HePpdu.
Definition: he-ppdu.cc:79
OFDM PPDU (11a)OfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header...
Definition: ofdm-ppdu.h:47
TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
Definition: he-ppdu.cc:293
uint16_t GetGuardInterval(void) const
Return the guard interval (in nanoseconds).
Definition: he-ppdu.cc:418
bool IsMu(void) const
Return true if the PPDU is a MU PPDU.
Definition: he-ppdu.cc:180
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsUlMu(void) const
Return true if the PPDU is an UL MU PPDU.
Definition: he-ppdu.cc:192
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:392
void SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
WifiPpduType
The type of PPDU (SU, DL MU, or UL MU)
The 2.4 GHz band.
Definition: wifi-phy-band.h:35
non-HE TB PPDU transmissions
Definition: he-ppdu.h:161
uint8_t GetMcs(void) const
Return the MCS field of HE-SIG-A1.
Definition: he-ppdu.cc:336
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
#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
uint16_t GetChannelWidth(void) const
Return the channel width (in MHz).
Definition: he-ppdu.cc:376
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:32
WifiConstPsduMap m_psdus
the PSDUs contained in this PPDU
Definition: wifi-ppdu.h:159
uint32_t GetSerializedSize(void) const
Definition: he-ppdu.cc:310
WifiTxVector DoGetTxVector(void) const override
Get the TXVECTOR used to send the PPDU.
Definition: he-ppdu.cc:122
HE-SIG PHY header (HE-SIG-A1/A2/B)
Definition: he-ppdu.h:51
uint8_t GetBssColor(void) const
Get the BSS color.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
Definition: wifi-phy.cc:1604
HePpdu(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, Time ppduDuration, WifiPhyBand band, uint64_t uid)
Create an SU HE PPDU, storing a PSDU.
Definition: he-ppdu.cc:69
uint8_t ReadU8(void)
Definition: buffer.h:1021
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1305
void SetLength(uint16_t length)
Fill the LENGTH field of L-SIG (in bytes).
Definition: ofdm-ppdu.cc:218
static TypeId GetTypeId(void)
Get the type ID.
Definition: he-ppdu.cc:282
void SetMuFlag(bool mu)
Set the Multi-User (MU) flag.
Definition: he-ppdu.cc:323
OFDMA portion of HE TB PPDU, which should only be sent on RU.
Definition: he-ppdu.h:163
const HeMuUserInfoMap & GetHeMuUserInfoMap(void) const
Get the map HE MU user-specific transmission information indexed by STA-ID.
Declaration of ns3::HePhy class and ns3::HeSigAParameters struct.
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:137
a unique identifier for an interface.
Definition: type-id.h:58
TxPsdFlag GetTxPsdFlag(void) const
Definition: he-ppdu.cc:235
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
uint16_t GetStaId(void) const override
Get the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise.
Definition: he-ppdu.cc:228
#define SU_STA_ID
Definition: wifi-mode.h:32
std::string PrintPayload(void) const override
Print the payload of the PPDU.
Definition: he-ppdu.cc:249
void SetMcs(uint8_t mcs)
Fill the MCS field of HE-SIG-A1.
Definition: he-ppdu.cc:329
uint16_t m_channelWidth
the channel width used to transmit that PPDU in MHz
Definition: ofdm-ppdu.h:129
bool IsDlMu(void) const
Return true if the PPDU is a DL MU PPDU.
Definition: he-ppdu.cc:186
preamble of HE TB PPDU, which should only be sent on minimum subset of 20 MHz channels containing RU ...
Definition: he-ppdu.h:162
void Serialize(Buffer::Iterator start) const
Definition: he-ppdu.cc:449
Declaration of ns3::HePpdu class.