A Discrete-Event Network Simulator
API
wifi-helper.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2008 INRIA
4  * Copyright (c) 2009 MIRKO BANCHI
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20  * Mirko Banchi <mk.banchi@gmail.com>
21  */
22 
23 #include "ns3/wifi-net-device.h"
24 #include "ns3/ap-wifi-mac.h"
25 #include "ns3/ampdu-subframe-header.h"
26 #include "ns3/mobility-model.h"
27 #include "ns3/log.h"
28 #include "ns3/pointer.h"
29 #include "ns3/radiotap-header.h"
30 #include "ns3/config.h"
31 #include "ns3/names.h"
32 #include "ns3/net-device-queue-interface.h"
33 #include "ns3/wifi-mac-queue.h"
34 #include "ns3/qos-utils.h"
35 #include "ns3/ht-configuration.h"
36 #include "ns3/vht-configuration.h"
37 #include "ns3/he-configuration.h"
38 #include "ns3/obss-pd-algorithm.h"
39 #include "wifi-helper.h"
40 
41 namespace ns3 {
42 
43 NS_LOG_COMPONENT_DEFINE ("WifiHelper");
44 
54 static void
57  std::string context,
59  WifiMode mode,
60  WifiPreamble preamble,
61  uint8_t txLevel)
62 {
63  NS_LOG_FUNCTION (stream << context << p << mode << preamble << txLevel);
64  *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << context << " " << mode << " " << *p << std::endl;
65 }
66 
75 static void
79  WifiMode mode,
80  WifiPreamble preamble,
81  uint8_t txLevel)
82 {
83  NS_LOG_FUNCTION (stream << p << mode << preamble << txLevel);
84  *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << mode << " " << *p << std::endl;
85 }
86 
96 static void
99  std::string context,
101  double snr,
102  WifiMode mode,
103  WifiPreamble preamble)
104 {
105  NS_LOG_FUNCTION (stream << context << p << snr << mode << preamble);
106  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << "" << context << " " << *p << std::endl;
107 }
108 
117 static void
121  double snr,
122  WifiMode mode,
123  WifiPreamble preamble)
124 {
125  NS_LOG_FUNCTION (stream << p << snr << mode << preamble);
126  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << " " << *p << std::endl;
127 }
128 
130  : m_pcapDlt (PcapHelper::DLT_IEEE802_11)
131 {
132  SetPreambleDetectionModel ("ns3::ThresholdPreambleDetectionModel");
133 }
134 
136 {
137 }
138 
139 void
140 WifiPhyHelper::Set (std::string name, const AttributeValue &v)
141 {
142  m_phy.Set (name, v);
143 }
144 
145 void
147  std::string n0, const AttributeValue &v0,
148  std::string n1, const AttributeValue &v1,
149  std::string n2, const AttributeValue &v2,
150  std::string n3, const AttributeValue &v3,
151  std::string n4, const AttributeValue &v4,
152  std::string n5, const AttributeValue &v5,
153  std::string n6, const AttributeValue &v6,
154  std::string n7, const AttributeValue &v7)
155 {
158  m_errorRateModel.Set (n0, v0);
159  m_errorRateModel.Set (n1, v1);
160  m_errorRateModel.Set (n2, v2);
161  m_errorRateModel.Set (n3, v3);
162  m_errorRateModel.Set (n4, v4);
163  m_errorRateModel.Set (n5, v5);
164  m_errorRateModel.Set (n6, v6);
165  m_errorRateModel.Set (n7, v7);
166 }
167 
168 void
170  std::string n0, const AttributeValue &v0,
171  std::string n1, const AttributeValue &v1,
172  std::string n2, const AttributeValue &v2,
173  std::string n3, const AttributeValue &v3,
174  std::string n4, const AttributeValue &v4,
175  std::string n5, const AttributeValue &v5,
176  std::string n6, const AttributeValue &v6,
177  std::string n7, const AttributeValue &v7)
178 {
181  m_frameCaptureModel.Set (n0, v0);
182  m_frameCaptureModel.Set (n1, v1);
183  m_frameCaptureModel.Set (n2, v2);
184  m_frameCaptureModel.Set (n3, v3);
185  m_frameCaptureModel.Set (n4, v4);
186  m_frameCaptureModel.Set (n5, v5);
187  m_frameCaptureModel.Set (n6, v6);
188  m_frameCaptureModel.Set (n7, v7);
189 }
190 
191 void
193  std::string n0, const AttributeValue &v0,
194  std::string n1, const AttributeValue &v1,
195  std::string n2, const AttributeValue &v2,
196  std::string n3, const AttributeValue &v3,
197  std::string n4, const AttributeValue &v4,
198  std::string n5, const AttributeValue &v5,
199  std::string n6, const AttributeValue &v6,
200  std::string n7, const AttributeValue &v7)
201 {
204  m_preambleDetectionModel.Set (n0, v0);
205  m_preambleDetectionModel.Set (n1, v1);
206  m_preambleDetectionModel.Set (n2, v2);
207  m_preambleDetectionModel.Set (n3, v3);
208  m_preambleDetectionModel.Set (n4, v4);
209  m_preambleDetectionModel.Set (n5, v5);
210  m_preambleDetectionModel.Set (n6, v6);
211  m_preambleDetectionModel.Set (n7, v7);
212 }
213 
214 void
216 {
218 }
219 
220 void
223  Ptr<const Packet> packet,
224  uint16_t channelFreqMhz,
225  WifiTxVector txVector,
226  MpduInfo aMpdu,
227  uint16_t staId)
228 {
229  uint32_t dlt = file->GetDataLinkType ();
230  switch (dlt)
231  {
233  file->Write (Simulator::Now (), packet);
234  return;
236  {
237  NS_FATAL_ERROR ("PcapSniffTxEvent(): DLT_PRISM_HEADER not implemented");
238  return;
239  }
241  {
242  Ptr<Packet> p = packet->Copy ();
243  RadiotapHeader header;
244  GetRadiotapHeader (header, p, channelFreqMhz, txVector, aMpdu, staId);
245  p->AddHeader (header);
246  file->Write (Simulator::Now (), p);
247  return;
248  }
249  default:
250  NS_ABORT_MSG ("PcapSniffTxEvent(): Unexpected data link type " << dlt);
251  }
252 }
253 
254 void
257  Ptr<const Packet> packet,
258  uint16_t channelFreqMhz,
259  WifiTxVector txVector,
260  MpduInfo aMpdu,
261  SignalNoiseDbm signalNoise,
262  uint16_t staId)
263 {
264  uint32_t dlt = file->GetDataLinkType ();
265  switch (dlt)
266  {
268  file->Write (Simulator::Now (), packet);
269  return;
271  {
272  NS_FATAL_ERROR ("PcapSniffRxEvent(): DLT_PRISM_HEADER not implemented");
273  return;
274  }
276  {
277  Ptr<Packet> p = packet->Copy ();
278  RadiotapHeader header;
279  GetRadiotapHeader (header, p, channelFreqMhz, txVector, aMpdu, staId, signalNoise);
280  p->AddHeader (header);
281  file->Write (Simulator::Now (), p);
282  return;
283  }
284  default:
285  NS_ABORT_MSG ("PcapSniffRxEvent(): Unexpected data link type " << dlt);
286  }
287 }
288 
289 void
291  RadiotapHeader &header,
292  Ptr<Packet> packet,
293  uint16_t channelFreqMhz,
294  WifiTxVector txVector,
295  MpduInfo aMpdu,
296  uint16_t staId,
297  SignalNoiseDbm signalNoise)
298 {
299  header.SetAntennaSignalPower (signalNoise.signal);
300  header.SetAntennaNoisePower (signalNoise.noise);
301  GetRadiotapHeader (header, packet, channelFreqMhz, txVector, aMpdu, staId);
302 }
303 
304 void
306  RadiotapHeader &header,
307  Ptr<Packet> packet,
308  uint16_t channelFreqMhz,
309  WifiTxVector txVector,
310  MpduInfo aMpdu,
311  uint16_t staId)
312 {
313  WifiPreamble preamble = txVector.GetPreambleType ();
314 
315  uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
316  header.SetTsft (Simulator::Now ().GetMicroSeconds ());
317 
318  //Our capture includes the FCS, so we set the flag to say so.
320 
321  if (preamble == WIFI_PREAMBLE_SHORT)
322  {
324  }
325 
326  if (txVector.GetGuardInterval () == 400)
327  {
329  }
330 
331  header.SetFrameFlags (frameFlags);
332 
333  uint64_t rate = 0;
334  if (txVector.GetMode (staId).GetModulationClass () != WIFI_MOD_CLASS_HT
335  && txVector.GetMode (staId).GetModulationClass () != WIFI_MOD_CLASS_VHT
336  && txVector.GetMode (staId).GetModulationClass () != WIFI_MOD_CLASS_HE)
337  {
338  rate = txVector.GetMode (staId).GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1) * txVector.GetNss (staId) / 500000;
339  header.SetRate (static_cast<uint8_t> (rate));
340  }
341 
342  uint16_t channelFlags = 0;
343  switch (rate)
344  {
345  case 2: //1Mbps
346  case 4: //2Mbps
347  case 10: //5Mbps
348  case 22: //11Mbps
349  channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
350  break;
351  default:
352  channelFlags |= RadiotapHeader::CHANNEL_FLAG_OFDM;
353  break;
354  }
355 
356  if (channelFreqMhz < 2500)
357  {
359  }
360  else
361  {
363  }
364 
365  header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
366 
367  if (txVector.GetMode (staId).GetModulationClass () == WIFI_MOD_CLASS_HT)
368  {
369  uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
370  uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
371 
373 
375  if (txVector.GetChannelWidth () == 40)
376  {
378  }
379 
381  if (txVector.GetGuardInterval () == 400)
382  {
384  }
385 
387 
388  mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
389  if (txVector.GetNess () & 0x01) //bit 1
390  {
392  }
393  if (txVector.GetNess () & 0x02) //bit 2
394  {
396  }
397 
398  mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
399 
400  mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
401  if (txVector.IsStbc ())
402  {
404  }
405 
406  header.SetMcsFields (mcsKnown, mcsFlags, txVector.GetMode (staId).GetMcsValue ());
407  }
408 
409  if (txVector.IsAggregation ())
410  {
411  uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
412  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
413  /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
415  uint32_t extractedLength;
416  packet->RemoveHeader (hdr);
417  extractedLength = hdr.GetLength ();
418  packet = packet->CreateFragment (0, static_cast<uint32_t> (extractedLength));
419  if (aMpdu.type == LAST_MPDU_IN_AGGREGATE || (hdr.GetEof () == true && hdr.GetLength () > 0))
420  {
421  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
422  }
423  header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, 1 /*CRC*/);
424  }
425 
426  if (txVector.GetMode (staId).GetModulationClass () == WIFI_MOD_CLASS_VHT)
427  {
428  uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
429  uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
430  uint8_t vhtBandwidth = 0;
431  uint8_t vhtMcsNss[4] = {0,0,0,0};
432  uint8_t vhtCoding = 0;
433  uint8_t vhtGroupId = 0;
434  uint16_t vhtPartialAid = 0;
435 
436  vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
437  if (txVector.IsStbc ())
438  {
439  vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
440  }
441 
443  if (txVector.GetGuardInterval () == 400)
444  {
446  }
447 
448  vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
449 
451  //not all bandwidth values are currently supported
452  if (txVector.GetChannelWidth () == 40)
453  {
454  vhtBandwidth = 1;
455  }
456  else if (txVector.GetChannelWidth () == 80)
457  {
458  vhtBandwidth = 4;
459  }
460  else if (txVector.GetChannelWidth () == 160)
461  {
462  vhtBandwidth = 11;
463  }
464 
465  //only SU PPDUs are currently supported
466  vhtMcsNss[0] |= (txVector.GetNss (staId) & 0x0f);
467  vhtMcsNss[0] |= ((txVector.GetMode (staId).GetMcsValue () << 4) & 0xf0);
468 
469  header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
470  }
471 
472  if (txVector.GetMode (staId).GetModulationClass () == WIFI_MOD_CLASS_HE)
473  {
475  if (preamble == WIFI_PREAMBLE_HE_ER_SU)
476  {
478  }
479  else if (preamble == WIFI_PREAMBLE_HE_MU)
480  {
483  }
484  else if (preamble == WIFI_PREAMBLE_HE_TB)
485  {
487  }
488 
489  uint16_t data2 = RadiotapHeader::HE_DATA2_GI_KNOWN;
490  if (preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB)
491  {
493  //HeRu indices start at 1 whereas RadioTap starts at 0
494  data2 |= (((txVector.GetHeMuUserInfo (staId).ru.GetIndex () - 1) << 8) & 0x3f00);
495  data2 |= (((!txVector.GetHeMuUserInfo (staId).ru.GetPrimary80MHz ()) << 15) & 0x8000);
496  }
497 
498  uint16_t data3 = 0;
499  data3 |= (txVector.GetBssColor () & 0x003f);
500  data3 |= ((txVector.GetMode (staId).GetMcsValue () << 8) & 0x0f00);
501 
502  uint16_t data4 = 0;
503  if (preamble == WIFI_PREAMBLE_HE_MU)
504  {
505  data4 |= ((staId << 4) & 0x7ff0);
506  }
507 
508  uint16_t data5 = 0;
509  if (preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB)
510  {
511  HeRu::RuType ruType = txVector.GetHeMuUserInfo (staId).ru.GetRuType ();
512  switch (ruType)
513  {
514  case HeRu::RU_26_TONE:
516  break;
517  case HeRu::RU_52_TONE:
519  break;
520  case HeRu::RU_106_TONE:
522  break;
523  case HeRu::RU_242_TONE:
525  break;
526  case HeRu::RU_484_TONE:
528  break;
529  case HeRu::RU_996_TONE:
531  break;
532  case HeRu::RU_2x996_TONE:
534  break;
535  default:
536  NS_ABORT_MSG ("Unexpected RU type");
537  }
538  }
539  else if (txVector.GetChannelWidth () == 40)
540  {
542  }
543  else if (txVector.GetChannelWidth () == 80)
544  {
546  }
547  else if (txVector.GetChannelWidth () == 160)
548  {
550  }
551  if (txVector.GetGuardInterval () == 1600)
552  {
554  }
555  else if (txVector.GetGuardInterval () == 3200)
556  {
558  }
559 
560  header.SetHeFields (data1, data2, data3, data4, data5, 0);
561  }
562 
563  if (preamble == WIFI_PREAMBLE_HE_MU)
564  {
565  //TODO: fill in fields (everything is set to 0 so far)
566  std::array<uint8_t, 4> ruChannel1, ruChannel2;
567  header.SetHeMuFields (0, 0, ruChannel1, ruChannel2);
568  header.SetHeMuPerUserFields (0, 0, 0, 0);
569  }
570 }
571 
572 void
574 {
575  switch (dlt)
576  {
577  case DLT_IEEE802_11:
579  return;
580  case DLT_PRISM_HEADER:
582  return;
585  return;
586  default:
587  NS_ABORT_MSG ("WifiPhyHelper::SetPcapFormat(): Unexpected format");
588  }
589 }
590 
593 {
594  return m_pcapDlt;
595 }
596 
597 void
598 WifiPhyHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
599 {
600  NS_LOG_FUNCTION (this << prefix << nd << promiscuous << explicitFilename);
601 
602  //All of the Pcap enable functions vector through here including the ones
603  //that are wandering through all of devices on perhaps all of the nodes in
604  //the system. We can only deal with devices of type WifiNetDevice.
605  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
606  if (device == 0)
607  {
608  NS_LOG_INFO ("WifiHelper::EnablePcapInternal(): Device " << &device << " not of type ns3::WifiNetDevice");
609  return;
610  }
611 
612  Ptr<WifiPhy> phy = device->GetPhy ();
613  NS_ABORT_MSG_IF (phy == 0, "WifiPhyHelper::EnablePcapInternal(): Phy layer in WifiNetDevice must be set");
614 
615  PcapHelper pcapHelper;
616 
617  std::string filename;
618  if (explicitFilename)
619  {
620  filename = prefix;
621  }
622  else
623  {
624  filename = pcapHelper.GetFilenameFromDevice (prefix, device);
625  }
626 
627  Ptr<PcapFileWrapper> file = pcapHelper.CreateFile (filename, std::ios::out, m_pcapDlt);
628 
629  phy->TraceConnectWithoutContext ("MonitorSnifferTx", MakeBoundCallback (&WifiPhyHelper::PcapSniffTxEvent, file));
630  phy->TraceConnectWithoutContext ("MonitorSnifferRx", MakeBoundCallback (&WifiPhyHelper::PcapSniffRxEvent, file));
631 }
632 
633 void
636  std::string prefix,
637  Ptr<NetDevice> nd,
638  bool explicitFilename)
639 {
640  //All of the ASCII enable functions vector through here including the ones
641  //that are wandering through all of devices on perhaps all of the nodes in
642  //the system. We can only deal with devices of type WifiNetDevice.
643  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
644  if (device == 0)
645  {
646  NS_LOG_INFO ("WifiHelper::EnableAsciiInternal(): Device " << device << " not of type ns3::WifiNetDevice");
647  return;
648  }
649 
650  //Our trace sinks are going to use packet printing, so we have to make sure
651  //that is turned on.
653 
654  uint32_t nodeid = nd->GetNode ()->GetId ();
655  uint32_t deviceid = nd->GetIfIndex ();
656  std::ostringstream oss;
657 
658  //If we are not provided an OutputStreamWrapper, we are expected to create
659  //one using the usual trace filename conventions and write our traces
660  //without a context since there will be one file per context and therefore
661  //the context would be redundant.
662  if (stream == 0)
663  {
664  //Set up an output stream object to deal with private ofstream copy
665  //constructor and lifetime issues. Let the helper decide the actual
666  //name of the file given the prefix.
667  AsciiTraceHelper asciiTraceHelper;
668 
669  std::string filename;
670  if (explicitFilename)
671  {
672  filename = prefix;
673  }
674  else
675  {
676  filename = asciiTraceHelper.GetFilenameFromDevice (prefix, device);
677  }
678 
679  Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
680  //We could go poking through the PHY and the state looking for the
681  //correct trace source, but we can let Config deal with that with
682  //some search cost. Since this is presumably happening at topology
683  //creation time, it doesn't seem much of a price to pay.
684  oss.str ("");
685  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
687 
688  oss.str ("");
689  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
691 
692  return;
693  }
694 
695  //If we are provided an OutputStreamWrapper, we are expected to use it, and
696  //to provide a context. We are free to come up with our own context if we
697  //want, and use the AsciiTraceHelper Hook*WithContext functions, but for
698  //compatibility and simplicity, we just use Config::Connect and let it deal
699  //with coming up with a context.
700  oss.str ("");
701  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
703 
704  oss.str ("");
705  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
707 }
708 
710 {
711 }
712 
714  : m_standard (WIFI_STANDARD_80211a),
715  m_selectQueueCallback (&SelectQueueByDSField)
716 {
717  SetRemoteStationManager ("ns3::ArfWifiManager");
718 }
719 
720 void
722  std::string n0, const AttributeValue &v0,
723  std::string n1, const AttributeValue &v1,
724  std::string n2, const AttributeValue &v2,
725  std::string n3, const AttributeValue &v3,
726  std::string n4, const AttributeValue &v4,
727  std::string n5, const AttributeValue &v5,
728  std::string n6, const AttributeValue &v6,
729  std::string n7, const AttributeValue &v7)
730 {
733  m_stationManager.Set (n0, v0);
734  m_stationManager.Set (n1, v1);
735  m_stationManager.Set (n2, v2);
736  m_stationManager.Set (n3, v3);
737  m_stationManager.Set (n4, v4);
738  m_stationManager.Set (n5, v5);
739  m_stationManager.Set (n6, v6);
740  m_stationManager.Set (n7, v7);
741 }
742 
743 void
745  std::string n0, const AttributeValue &v0,
746  std::string n1, const AttributeValue &v1,
747  std::string n2, const AttributeValue &v2,
748  std::string n3, const AttributeValue &v3,
749  std::string n4, const AttributeValue &v4,
750  std::string n5, const AttributeValue &v5,
751  std::string n6, const AttributeValue &v6,
752  std::string n7, const AttributeValue &v7)
753 {
756  m_obssPdAlgorithm.Set (n0, v0);
757  m_obssPdAlgorithm.Set (n1, v1);
758  m_obssPdAlgorithm.Set (n2, v2);
759  m_obssPdAlgorithm.Set (n3, v3);
760  m_obssPdAlgorithm.Set (n4, v4);
761  m_obssPdAlgorithm.Set (n5, v5);
762  m_obssPdAlgorithm.Set (n6, v6);
763  m_obssPdAlgorithm.Set (n7, v7);
764 }
765 
766 void
768 {
769  m_standard = standard;
770 }
771 
772 // NS_DEPRECATED_3_32
773 void
775 {
776  switch (standard)
777  {
780  return;
783  return;
786  return;
787  // remove the next value from WifiPhyStandard when deprecation ends
790  return;
791  // remove the next value from WifiPhyStandard when deprecation ends
794  return;
797  return;
798  default:
799  NS_FATAL_ERROR ("Unsupported value of WifiPhyStandard");
800  }
801 }
802 
803 void
805 {
807 }
808 
811  const WifiMacHelper &macHelper,
813  NodeContainer::Iterator last) const
814 {
816  for (NodeContainer::Iterator i = first; i != last; ++i)
817  {
818  Ptr<Node> node = *i;
819  Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
820  auto it = wifiStandards.find (m_standard);
821  if (it == wifiStandards.end ())
822  {
823  NS_FATAL_ERROR ("Selected standard is not defined!");
824  return devices;
825  }
826  if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211n)
827  {
828  Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
829  device->SetHtConfiguration (htConfiguration);
830  }
831  if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ac) && (it->second.phyBand != WIFI_PHY_BAND_2_4GHZ))
832  {
833  Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration> ();
834  device->SetVhtConfiguration (vhtConfiguration);
835  }
836  if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax)
837  {
838  Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
839  device->SetHeConfiguration (heConfiguration);
840  }
842  Ptr<WifiMac> mac = macHelper.Create (device, m_standard);
843  Ptr<WifiPhy> phy = phyHelper.Create (node, device);
844  phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
845  device->SetMac (mac);
846  device->SetPhy (phy);
847  device->SetRemoteStationManager (manager);
848  node->AddDevice (device);
849  if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax) && (m_obssPdAlgorithm.IsTypeIdSet ()))
850  {
852  device->AggregateObject (obssPdAlgorithm);
853  obssPdAlgorithm->ConnectWifiNetDevice (device);
854  }
855  devices.Add (device);
856  NS_LOG_DEBUG ("node=" << node << ", mob=" << node->GetObject<MobilityModel> ());
857  // Aggregate a NetDeviceQueueInterface object if a RegularWifiMac is installed
858  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
859  if (rmac)
860  {
862  BooleanValue qosSupported;
863  Ptr<WifiMacQueue> wmq;
864 
865  rmac->GetAttributeFailSafe ("QosSupported", qosSupported);
866  if (qosSupported.Get ())
867  {
868  ndqi = CreateObjectWithAttributes<NetDeviceQueueInterface> ("NTxQueues",
869  UintegerValue (4));
870  for (auto& ac : {AC_BE, AC_BK, AC_VI, AC_VO})
871  {
872  Ptr<QosTxop> qosTxop = rmac->GetQosTxop (ac);
873  wmq = qosTxop->GetWifiMacQueue ();
874  ndqi->GetTxQueue (static_cast<std::size_t> (ac))->ConnectQueueTraces (wmq);
875  }
876  ndqi->SetSelectQueueCallback (m_selectQueueCallback);
877  }
878  else
879  {
880  ndqi = CreateObject<NetDeviceQueueInterface> ();
881 
882  wmq = rmac->GetTxop ()->GetWifiMacQueue ();
883  ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
884  }
885  device->AggregateObject (ndqi);
886  }
887  }
888  return devices;
889 }
890 
893  const WifiMacHelper &macHelper, NodeContainer c) const
894 {
895  return Install (phyHelper, macHelper, c.Begin (), c.End ());
896 }
897 
900  const WifiMacHelper &mac, Ptr<Node> node) const
901 {
902  return Install (phy, mac, NodeContainer (node));
903 }
904 
907  const WifiMacHelper &mac, std::string nodeName) const
908 {
909  Ptr<Node> node = Names::Find<Node> (nodeName);
910  return Install (phy, mac, NodeContainer (node));
911 }
912 
913 void
915 {
918 
919  LogComponentEnable ("AarfWifiManager", LOG_LEVEL_ALL);
920  LogComponentEnable ("AarfcdWifiManager", LOG_LEVEL_ALL);
921  LogComponentEnable ("AdhocWifiMac", LOG_LEVEL_ALL);
922  LogComponentEnable ("AmrrWifiManager", LOG_LEVEL_ALL);
923  LogComponentEnable ("ApWifiMac", LOG_LEVEL_ALL);
924  LogComponentEnable ("AparfWifiManager", LOG_LEVEL_ALL);
925  LogComponentEnable ("ArfWifiManager", LOG_LEVEL_ALL);
926  LogComponentEnable ("BlockAckAgreement", LOG_LEVEL_ALL);
927  LogComponentEnable ("RecipientBlockAckAgreement", LOG_LEVEL_ALL);
928  LogComponentEnable ("BlockAckManager", LOG_LEVEL_ALL);
929  LogComponentEnable ("CaraWifiManager", LOG_LEVEL_ALL);
930  LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
931  LogComponentEnable ("ConstantObssPdAlgorithm", LOG_LEVEL_ALL);
932  LogComponentEnable ("ConstantRateWifiManager", LOG_LEVEL_ALL);
933  LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
934  LogComponentEnable ("DsssErrorRateModel", LOG_LEVEL_ALL);
935  LogComponentEnable ("DsssPhy", LOG_LEVEL_ALL);
936  LogComponentEnable ("DsssPpdu", LOG_LEVEL_ALL);
937  LogComponentEnable ("ErpOfdmPhy", LOG_LEVEL_ALL);
938  LogComponentEnable ("ErpOfdmPpdu", LOG_LEVEL_ALL);
939  LogComponentEnable ("FrameExchangeManager", LOG_LEVEL_ALL);
940  LogComponentEnable ("HeConfiguration", LOG_LEVEL_ALL);
941  LogComponentEnable ("HeFrameExchangeManager", LOG_LEVEL_ALL);
943  LogComponentEnable ("HePpdu", LOG_LEVEL_ALL);
944  LogComponentEnable ("HtConfiguration", LOG_LEVEL_ALL);
945  LogComponentEnable ("HtFrameExchangeManager", LOG_LEVEL_ALL);
947  LogComponentEnable ("HtPpdu", LOG_LEVEL_ALL);
948  LogComponentEnable ("IdealWifiManager", LOG_LEVEL_ALL);
949  LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
950  LogComponentEnable ("MacRxMiddle", LOG_LEVEL_ALL);
951  LogComponentEnable ("MacTxMiddle", LOG_LEVEL_ALL);
952  LogComponentEnable ("MinstrelHtWifiManager", LOG_LEVEL_ALL);
953  LogComponentEnable ("MinstrelWifiManager", LOG_LEVEL_ALL);
954  LogComponentEnable ("MpduAggregator", LOG_LEVEL_ALL);
955  LogComponentEnable ("MsduAggregator", LOG_LEVEL_ALL);
956  LogComponentEnable ("MultiUserScheduler", LOG_LEVEL_ALL);
957  LogComponentEnable ("NistErrorRateModel", LOG_LEVEL_ALL);
958  LogComponentEnable ("ObssPdAlgorithm", LOG_LEVEL_ALL);
959  LogComponentEnable ("OfdmPhy", LOG_LEVEL_ALL);
960  LogComponentEnable ("OnoeWifiManager", LOG_LEVEL_ALL);
961  LogComponentEnable ("OriginatorBlockAckAgreement", LOG_LEVEL_ALL);
962  LogComponentEnable ("OfdmPpdu", LOG_LEVEL_ALL);
963  LogComponentEnable ("ParfWifiManager", LOG_LEVEL_ALL);
964  LogComponentEnable ("PhyEntity", LOG_LEVEL_ALL);
965  LogComponentEnable ("QosFrameExchangeManager", LOG_LEVEL_ALL);
966  LogComponentEnable ("QosTxop", LOG_LEVEL_ALL);
967  LogComponentEnable ("RegularWifiMac", LOG_LEVEL_ALL);
968  LogComponentEnable ("RraaWifiManager", LOG_LEVEL_ALL);
969  LogComponentEnable ("RrMultiUserScheduler", LOG_LEVEL_ALL);
970  LogComponentEnable ("RrpaaWifiManager", LOG_LEVEL_ALL);
971  LogComponentEnable ("SimpleFrameCaptureModel", LOG_LEVEL_ALL);
972  LogComponentEnable ("SpectrumWifiPhy", LOG_LEVEL_ALL);
973  LogComponentEnable ("StaWifiMac", LOG_LEVEL_ALL);
974  LogComponentEnable ("SupportedRates", LOG_LEVEL_ALL);
975  LogComponentEnable ("TableBasedErrorRateModel", LOG_LEVEL_ALL);
976  LogComponentEnable ("ThompsonSamplingWifiManager", LOG_LEVEL_ALL);
977  LogComponentEnable ("ThresholdPreambleDetectionModel", LOG_LEVEL_ALL);
979  LogComponentEnable ("VhtConfiguration", LOG_LEVEL_ALL);
980  LogComponentEnable ("VhtFrameExchangeManager", LOG_LEVEL_ALL);
981  LogComponentEnable ("VhtPhy", LOG_LEVEL_ALL);
982  LogComponentEnable ("VhtPpdu", LOG_LEVEL_ALL);
983  LogComponentEnable ("WifiAckManager", LOG_LEVEL_ALL);
984  LogComponentEnable ("WifiDefaultAckManager", LOG_LEVEL_ALL);
985  LogComponentEnable ("WifiDefaultProtectionManager", LOG_LEVEL_ALL);
986  LogComponentEnable ("WifiMac", LOG_LEVEL_ALL);
987  LogComponentEnable ("WifiMacQueue", LOG_LEVEL_ALL);
988  LogComponentEnable ("WifiMacQueueItem", LOG_LEVEL_ALL);
989  LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL);
990  LogComponentEnable ("WifiPhyStateHelper", LOG_LEVEL_ALL);
991  LogComponentEnable ("WifiPhy", LOG_LEVEL_ALL);
992  LogComponentEnable ("WifiPhyOperatingChannel", LOG_LEVEL_ALL);
993  LogComponentEnable ("WifiPpdu", LOG_LEVEL_ALL);
994  LogComponentEnable ("WifiProtectionManager", LOG_LEVEL_ALL);
995  LogComponentEnable ("WifiPsdu", LOG_LEVEL_ALL);
996  LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_ALL);
997  LogComponentEnable ("WifiRemoteStationManager", LOG_LEVEL_ALL);
998  LogComponentEnable ("WifiSpectrumPhyInterface", LOG_LEVEL_ALL);
999  LogComponentEnable ("WifiSpectrumSignalParameters", LOG_LEVEL_ALL);
1000  LogComponentEnable ("WifiTxCurrentModel", LOG_LEVEL_ALL);
1001  LogComponentEnable ("WifiTxParameters", LOG_LEVEL_ALL);
1002  LogComponentEnable ("WifiTxTimer", LOG_LEVEL_ALL);
1003  LogComponentEnable ("YansErrorRateModel", LOG_LEVEL_ALL);
1004  LogComponentEnable ("YansWifiChannel", LOG_LEVEL_ALL);
1005  LogComponentEnable ("YansWifiPhy", LOG_LEVEL_ALL);
1006 
1007  //From Spectrum
1008  LogComponentEnable ("WifiSpectrumValueHelper", LOG_LEVEL_ALL);
1009 }
1010 
1011 int64_t
1013 {
1014  int64_t currentStream = stream;
1015  Ptr<NetDevice> netDevice;
1016  for (NetDeviceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
1017  {
1018  netDevice = (*i);
1019  Ptr<WifiNetDevice> wifi = DynamicCast<WifiNetDevice> (netDevice);
1020  if (wifi)
1021  {
1022  //Handle any random numbers in the PHY objects.
1023  currentStream += wifi->GetPhy ()->AssignStreams (currentStream);
1024 
1025  //Handle any random numbers in the station managers.
1026  currentStream += wifi->GetRemoteStationManager ()->AssignStreams (currentStream);
1027 
1028  //Handle any random numbers in the MAC objects.
1029  Ptr<WifiMac> mac = wifi->GetMac ();
1030  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
1031  if (rmac)
1032  {
1033  PointerValue ptr;
1034  rmac->GetAttribute ("Txop", ptr);
1035  Ptr<Txop> txop = ptr.Get<Txop> ();
1036  currentStream += txop->AssignStreams (currentStream);
1037 
1038  rmac->GetAttribute ("VO_Txop", ptr);
1039  Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
1040  currentStream += vo_txop->AssignStreams (currentStream);
1041 
1042  rmac->GetAttribute ("VI_Txop", ptr);
1043  Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
1044  currentStream += vi_txop->AssignStreams (currentStream);
1045 
1046  rmac->GetAttribute ("BE_Txop", ptr);
1047  Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
1048  currentStream += be_txop->AssignStreams (currentStream);
1049 
1050  rmac->GetAttribute ("BK_Txop", ptr);
1051  Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
1052  currentStream += bk_txop->AssignStreams (currentStream);
1053 
1054  //if an AP, handle any beacon jitter
1055  Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (rmac);
1056  if (apmac)
1057  {
1058  currentStream += apmac->AssignStreams (currentStream);
1059  }
1060  }
1061  }
1062  }
1063  return (currentStream - stream);
1064 }
1065 
1066 } //namespace ns3
virtual ~WifiPhyHelper()
Definition: wifi-helper.cc:135
ERP-OFDM PHY (Clause 19, Section 19.5)
MpduInfo structure.
Definition: phy-entity.h:59
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
Frame used short guard interval (HT)
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:140
void SetVhtFields(uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t mcs_nss [4], uint8_t coding, uint8_t group_id, uint16_t partial_aid)
Set the VHT fields.
void SetPreambleDetectionModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:192
double signal
signal strength in dBm
Definition: phy-entity.h:54
bool IsAggregation(void) const
Checks whether the PSDU contains A-MPDU.
Prefix all trace prints with simulation node.
Definition: log.h:120
Manage ASCII trace files for device models.
Definition: trace-helper.h:162
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
AttributeValue implementation for Boolean.
Definition: boolean.h:36
Ptr< T > Get(void) const
Definition: pointer.h:201
HT PHY for the 5 GHz band (clause 20)
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:50
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Beamformed known/applicable (this flag should be set to zero for MU PPDUs).
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer::Iterator first, NodeContainer::Iterator last) const
Definition: wifi-helper.cc:810
static void AsciiPhyReceiveSinkWithoutContext(Ptr< OutputStreamWrapper > stream, Ptr< const Packet > p, double snr, WifiMode mode, enum WifiPreamble preamble)
ASCII Phy receive sink without context.
Definition: wave-helper.cc:109
void SetObssPdAlgorithm(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:744
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:721
Iterator End(void) const
Get an iterator which indicates past-the-last NetDevice in the container.
Radiotap header implementation.
virtual ~WifiHelper()
Definition: wifi-helper.cc:709
Hold a value for an Attribute.
Definition: attribute.h:68
Manage pcap files for device models.
Definition: trace-helper.h:38
create PHY objects
Definition: wifi-helper.h:46
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1703
PcapHelper::DataLinkType m_pcapDlt
PCAP data link type.
Definition: wifi-helper.h:315
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
Definition: qos-txop.h:74
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:380
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
Definition: packet.cc:227
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
void SetHtConfiguration(Ptr< HtConfiguration > htConfiguration)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
OBSS PD algorithm interfaceThis object provides the interface for all OBSS_PD algorithms and is desig...
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
bool IsStbc(void) const
Check if STBC is used or not.
static void AsciiPhyReceiveSinkWithContext(Ptr< OutputStreamWrapper > stream, std::string context, Ptr< const Packet > p, double snr, WifiMode mode, enum WifiPreamble preamble)
ASCII Phy receive sink with context.
Definition: wave-helper.cc:88
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
uint8_t GetNess(void) const
uint16_t GetGuardInterval(void) const
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we&#39;ll use to write the traced bits. ...
HT PHY for the 2.4 GHz band (clause 20)
void SetAntennaNoisePower(double noise)
Set the RF noise power at the antenna as a decibel difference from an arbitrary, fixed reference...
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.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
ObjectFactory m_errorRateModel
error rate model
Definition: wifi-helper.h:241
bool GetPrimary80MHz(void) const
Get the primary 80 MHz flag.
Definition: he-ru.cc:181
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the ascii trace helper figure out a reasonable filename to use for an ascii trace file associated...
HeMuUserInfo GetHeMuUserInfo(uint16_t staId) const
Get the HE MU user-specific transmission information for the given STA-ID.
Frame sent/received with short preamble.
void SetTsft(uint64_t tsft)
Set the Time Synchronization Function Timer (TSFT) value.
Ptr< PcapFileWrapper > CreateFile(std::string filename, std::ios::openmode filemode, DataLinkType dataLinkType, uint32_t snapLen=std::numeric_limits< uint32_t >::max(), int32_t tzCorrection=0)
Create and initialize a pcap file.
Definition: trace-helper.cc:49
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:47
WifiHelper()
Create a Wifi helper in an empty state: all its parameters must be set before calling ns3::WifiHelper...
Definition: wifi-helper.cc:713
const std::map< WifiStandard, WifiStandardInfo > wifiStandards
map a given standard configured by the user to the corresponding WifiStandardInfo ...
virtual void EnablePcapInternal(std::string prefix, Ptr< NetDevice > nd, bool promiscuous, bool explicitFilename) override
Enable pcap output the indicated net device.
Definition: wifi-helper.cc:598
phy
Definition: third.py:93
ObjectFactory m_preambleDetectionModel
preamble detection model
Definition: wifi-helper.h:243
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...
WifiPreamble GetPreambleType(void) const
DataLinkType
This enumeration holds the data link types that will be written to the pcap file. ...
Definition: trace-helper.h:50
void SetHeConfiguration(Ptr< HeConfiguration > heConfiguration)
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
Keep track of the current position and velocity of an object.
WifiPhyStandard
Identifies the PHY specification that a Wifi device is configured to use.
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the pcap helper figure out a reasonable filename to use for a pcap file associated with a device...
Definition: trace-helper.cc:80
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
Video.
Definition: qos-utils.h:77
bool GetEof(void) const
Return the EOF field.
virtual Ptr< WifiMac > Create(Ptr< NetDevice > device, WifiStandard standard) const
static void EnablePrinting(void)
Enable printing packets metadata.
Definition: packet.cc:572
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetMac(const Ptr< WifiMac > mac)
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Definition: txop.cc:303
Iterator Begin(void) const
Get an iterator which refers to the first NetDevice in the container.
This frame is the last subframe.
static void PcapSniffTxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, uint16_t staId=SU_STA_ID)
Definition: wifi-helper.cc:221
Hold an unsigned integer type.
Definition: uinteger.h:44
void SetChannelFrequencyAndFlags(uint16_t frequency, uint16_t flags)
Set the transmit/receive channel frequency and flags.
holds a vector of ns3::NetDevice pointers
mac
Definition: third.py:99
Ness - bit 0 (LSB) of Number of extension spatial streams.
void SetFrameCaptureModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:169
Headers for A-MPDU subframes.
void SetHeFields(uint16_t data1, uint16_t data2, uint16_t data3, uint16_t data4, uint16_t data5, uint16_t data6)
Set the HE fields.
Best Effort.
Definition: qos-utils.h:73
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the PHY and MAC aspects ...
Hold together all Wifi-related objects.
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:901
ObjectFactory m_obssPdAlgorithm
OBSS_PD algorithm.
Definition: wifi-helper.h:531
PcapHelper::DataLinkType GetPcapDataLinkType(void) const
Get the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:592
hold a list of per-remote-station state.
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:159
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
Include Prism monitor mode information.
Definition: wifi-helper.h:179
void SetFrameFlags(uint8_t flags)
Set the frame flags of the transmitted or received frame.
bool Get(void) const
Definition: boolean.cc:51
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Ptr< WifiPhy > GetPhy(void) const
void SetRate(uint8_t rate)
Set the transmit/receive channel frequency in units of megahertz.
double f(double x, void *params)
Definition: 80211b.c:70
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:385
Prefix all trace prints with simulation time.
Definition: log.h:119
OFDM PHY (Clause 17)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetHeMuPerUserFields(uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown)
Set the HE MU per user fields.
WifiStandard
Identifies the allowed configurations that a Wifi device is configured to use.
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
Definition: pointer.h:36
uint8_t SelectQueueByDSField(Ptr< QueueItem > item)
Determine the TX queue for a given packet.
Definition: qos-utils.cc:252
Background.
Definition: qos-utils.h:75
Ness data - bit 1 (MSB) of Number of extension spatial streams.
DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18)
virtual void SetStandard(WifiStandard standard)
Definition: wifi-helper.cc:767
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
RuType GetRuType(void) const
Get the RU type.
Definition: he-ru.cc:167
RuType
The different HE Resource Unit (RU) types.
Definition: he-ru.h:41
SelectQueueCallback m_selectQueueCallback
select queue callback
Definition: wifi-helper.h:530
void SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs)
Set the MCS fields.
ObjectFactory m_stationManager
station manager
Definition: wifi-helper.h:527
create MAC layers for a ns3::WifiNetDevice.
HeRu::RuSpec ru
RU specification.
Ness known (Number of extension spatial streams)
The 2.4 GHz band.
Definition: wifi-phy-band.h:35
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:573
void SetErrorRateModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:146
bool IsTypeIdSet(void) const
Check if the ObjectFactory has been configured with a TypeId.
ObjectFactory m_phy
PHY object.
Definition: wifi-helper.h:240
Space-time block coding (1 if all spatial streams of all users have STBC, 0 otherwise).
Voice.
Definition: qos-utils.h:79
wifi
Definition: third.py:96
static void GetRadiotapHeader(RadiotapHeader &header, Ptr< Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, uint16_t staId)
Get the Radiotap header for a transmitted packet.
Definition: wifi-helper.cc:305
void SetHeMuFields(uint16_t flags1, uint16_t flags2, const std::array< uint8_t, 4 > &ruChannel1, const std::array< uint8_t, 4 > &ruChannel2)
Set the HE MU fields.
Instantiate subclasses of ns3::Object.
void SetPhy(const Ptr< WifiPhy > phy)
static void PcapSniffRxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId=SU_STA_ID)
Definition: wifi-helper.cc:255
Set if all spatial streams of all users have space-time block coding.
static void EnableLogComponents(void)
Helper to enable all WifiNetDevice log components with one statement.
Definition: wifi-helper.cc:914
virtual Ptr< WifiPhy > Create(Ptr< Node > node, Ptr< NetDevice > device) const =0
void SetSelectQueueCallback(SelectQueueCallback f)
Definition: wifi-helper.cc:804
virtual void EnableAsciiInternal(Ptr< OutputStreamWrapper > stream, std::string prefix, Ptr< NetDevice > nd, bool explicitFilename) override
Enable ASCII trace output on the indicated net device.
Definition: wifi-helper.cc:634
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
SignalNoiseDbm structure.
Definition: phy-entity.h:52
uint32_t mpduRefNumber
MPDU ref number.
Definition: phy-entity.h:62
uint8_t GetBssColor(void) const
Get the BSS color.
The MPDU is the last aggregate in an A-MPDU with multiple MPDUs.
std::vector< Ptr< NetDevice > >::const_iterator Iterator
NetDevice container iterator.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
IEEE 802.11 Wireless LAN headers on packets.
Definition: wifi-helper.h:178
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Definition: txop.cc:150
uint16_t GetLength(void) const
Return the length field.
Last subframe is known (should be set for all subframes in an A-MPDU)
Print everything.
Definition: log.h:116
ObjectFactory m_frameCaptureModel
frame capture model
Definition: wifi-helper.h:242
double noise
noise power in dBm
Definition: phy-entity.h:55
Spatial Reuse 2 known (HE TRIG PPDU format), STA-ID known (HE MU PPDU format)
std::function< std::size_t(Ptr< QueueItem >)> SelectQueueCallback
Callback invoked to determine the MAC queue selected for a given packet.
Definition: wifi-helper.h:406
uint16_t GetChannelWidth(void) const
Default: 20 MHz, long guard interval, mixed HT format and BCC FEC type.
SupportedPcapDataLinkTypes
An enumeration of the pcap data link types (DLTs) which this helper supports.
Definition: wifi-helper.h:176
devices
Definition: first.py:39
void DisablePreambleDetectionModel()
Disable the preamble detection model.
Definition: wifi-helper.cc:215
Definition: first.py:1
std::size_t GetIndex(void) const
Get the RU index.
Definition: he-ru.cc:174
WifiStandard m_standard
wifi standard
Definition: wifi-helper.h:529
MpduType type
type of MPDU
Definition: phy-entity.h:61
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:137
void SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc)
Set the A-MPDU status fields.
a unique identifier for an interface.
Definition: type-id.h:58
Include Radiotap link layer information.
Definition: wifi-helper.h:180
static void AsciiPhyTransmitSinkWithContext(Ptr< OutputStreamWrapper > stream, std::string context, Ptr< const Packet > p, WifiMode mode, WifiPreamble preamble, uint8_t txLevel)
ASCII Phy transmit sink with context.
Definition: wave-helper.cc:46
void SetVhtConfiguration(Ptr< VhtConfiguration > vhtConfiguration)
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:100
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
void SetAntennaSignalPower(double signal)
Set the RF signal power at the antenna as a decibel difference from an arbitrary, fixed reference...
void SetRemoteStationManager(const Ptr< WifiRemoteStationManager > manager)
Handle packet fragmentation and retransmissions for data and management frames.
Definition: txop.h:65
static void AsciiPhyTransmitSinkWithoutContext(Ptr< OutputStreamWrapper > stream, Ptr< const Packet > p, WifiMode mode, WifiPreamble preamble, uint8_t txLevel)
ASCII Phy transmit sink without context.
Definition: wave-helper.cc:67