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/minstrel-wifi-manager.h"
25 #include "ns3/minstrel-ht-wifi-manager.h"
26 #include "ns3/ap-wifi-mac.h"
27 #include "ns3/ampdu-subframe-header.h"
28 #include "ns3/mobility-model.h"
29 #include "ns3/log.h"
30 #include "ns3/pointer.h"
31 #include "ns3/radiotap-header.h"
32 #include "ns3/config.h"
33 #include "ns3/names.h"
34 #include "ns3/net-device-queue-interface.h"
35 #include "ns3/wifi-mac-queue.h"
36 #include "ns3/qos-utils.h"
37 #include "ns3/ht-configuration.h"
38 #include "ns3/vht-configuration.h"
39 #include "ns3/he-configuration.h"
40 #include "ns3/obss-pd-algorithm.h"
41 #include "ns3/wifi-ack-policy-selector.h"
42 #include "wifi-helper.h"
43 
44 namespace ns3 {
45 
46 NS_LOG_COMPONENT_DEFINE ("WifiHelper");
47 
57 static void
60  std::string context,
62  WifiMode mode,
63  WifiPreamble preamble,
64  uint8_t txLevel)
65 {
66  NS_LOG_FUNCTION (stream << context << p << mode << preamble << txLevel);
67  *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << context << " " << mode << " " << *p << std::endl;
68 }
69 
78 static void
82  WifiMode mode,
83  WifiPreamble preamble,
84  uint8_t txLevel)
85 {
86  NS_LOG_FUNCTION (stream << p << mode << preamble << txLevel);
87  *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << mode << " " << *p << std::endl;
88 }
89 
99 static void
102  std::string context,
104  double snr,
105  WifiMode mode,
106  WifiPreamble preamble)
107 {
108  NS_LOG_FUNCTION (stream << context << p << snr << mode << preamble);
109  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << "" << context << " " << *p << std::endl;
110 }
111 
120 static void
124  double snr,
125  WifiMode mode,
126  WifiPreamble preamble)
127 {
128  NS_LOG_FUNCTION (stream << p << snr << mode << preamble);
129  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << " " << *p << std::endl;
130 }
131 
133  : m_pcapDlt (PcapHelper::DLT_IEEE802_11)
134 {
135  SetPreambleDetectionModel ("ns3::ThresholdPreambleDetectionModel");
136 }
137 
139 {
140 }
141 
142 void
143 WifiPhyHelper::Set (std::string name, const AttributeValue &v)
144 {
145  m_phy.Set (name, v);
146 }
147 
148 void
150  std::string n0, const AttributeValue &v0,
151  std::string n1, const AttributeValue &v1,
152  std::string n2, const AttributeValue &v2,
153  std::string n3, const AttributeValue &v3,
154  std::string n4, const AttributeValue &v4,
155  std::string n5, const AttributeValue &v5,
156  std::string n6, const AttributeValue &v6,
157  std::string n7, const AttributeValue &v7)
158 {
161  m_errorRateModel.Set (n0, v0);
162  m_errorRateModel.Set (n1, v1);
163  m_errorRateModel.Set (n2, v2);
164  m_errorRateModel.Set (n3, v3);
165  m_errorRateModel.Set (n4, v4);
166  m_errorRateModel.Set (n5, v5);
167  m_errorRateModel.Set (n6, v6);
168  m_errorRateModel.Set (n7, v7);
169 }
170 
171 void
173  std::string n0, const AttributeValue &v0,
174  std::string n1, const AttributeValue &v1,
175  std::string n2, const AttributeValue &v2,
176  std::string n3, const AttributeValue &v3,
177  std::string n4, const AttributeValue &v4,
178  std::string n5, const AttributeValue &v5,
179  std::string n6, const AttributeValue &v6,
180  std::string n7, const AttributeValue &v7)
181 {
184  m_frameCaptureModel.Set (n0, v0);
185  m_frameCaptureModel.Set (n1, v1);
186  m_frameCaptureModel.Set (n2, v2);
187  m_frameCaptureModel.Set (n3, v3);
188  m_frameCaptureModel.Set (n4, v4);
189  m_frameCaptureModel.Set (n5, v5);
190  m_frameCaptureModel.Set (n6, v6);
191  m_frameCaptureModel.Set (n7, v7);
192 }
193 
194 void
196  std::string n0, const AttributeValue &v0,
197  std::string n1, const AttributeValue &v1,
198  std::string n2, const AttributeValue &v2,
199  std::string n3, const AttributeValue &v3,
200  std::string n4, const AttributeValue &v4,
201  std::string n5, const AttributeValue &v5,
202  std::string n6, const AttributeValue &v6,
203  std::string n7, const AttributeValue &v7)
204 {
207  m_preambleDetectionModel.Set (n0, v0);
208  m_preambleDetectionModel.Set (n1, v1);
209  m_preambleDetectionModel.Set (n2, v2);
210  m_preambleDetectionModel.Set (n3, v3);
211  m_preambleDetectionModel.Set (n4, v4);
212  m_preambleDetectionModel.Set (n5, v5);
213  m_preambleDetectionModel.Set (n6, v6);
214  m_preambleDetectionModel.Set (n7, v7);
215 }
216 
217 void
219 {
221 }
222 
223 void
226  Ptr<const Packet> packet,
227  uint16_t channelFreqMhz,
228  WifiTxVector txVector,
229  MpduInfo aMpdu)
230 {
231  uint32_t dlt = file->GetDataLinkType ();
232  switch (dlt)
233  {
235  file->Write (Simulator::Now (), packet);
236  return;
238  {
239  NS_FATAL_ERROR ("PcapSniffTxEvent(): DLT_PRISM_HEADER not implemented");
240  return;
241  }
243  {
244  Ptr<Packet> p = packet->Copy ();
245  RadiotapHeader header = GetRadiotapHeader (p, channelFreqMhz, txVector, aMpdu);
246  p->AddHeader (header);
247  file->Write (Simulator::Now (), p);
248  return;
249  }
250  default:
251  NS_ABORT_MSG ("PcapSniffTxEvent(): Unexpected data link type " << dlt);
252  }
253 }
254 
255 void
258  Ptr<const Packet> packet,
259  uint16_t channelFreqMhz,
260  WifiTxVector txVector,
261  MpduInfo aMpdu,
262  SignalNoiseDbm signalNoise)
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 = GetRadiotapHeader (p, channelFreqMhz, txVector, aMpdu);
279  header.SetAntennaSignalPower (signalNoise.signal);
280  header.SetAntennaNoisePower (signalNoise.noise);
281  p->AddHeader (header);
282  file->Write (Simulator::Now (), p);
283  return;
284  }
285  default:
286  NS_ABORT_MSG ("PcapSniffRxEvent(): Unexpected data link type " << dlt);
287  }
288 }
289 
292  Ptr<Packet> packet,
293  uint16_t channelFreqMhz,
294  WifiTxVector txVector,
295  MpduInfo aMpdu)
296 {
297  RadiotapHeader header;
298  WifiPreamble preamble = txVector.GetPreambleType ();
299 
300  uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
301  header.SetTsft (Simulator::Now ().GetMicroSeconds ());
302 
303  //Our capture includes the FCS, so we set the flag to say so.
305 
306  if (preamble == WIFI_PREAMBLE_SHORT)
307  {
309  }
310 
311  if (txVector.GetGuardInterval () == 400)
312  {
314  }
315 
316  header.SetFrameFlags (frameFlags);
317 
318  uint64_t rate = 0;
319  if (txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT
320  && txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_VHT
321  && txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HE)
322  {
323  rate = txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1) * txVector.GetNss () / 500000;
324  header.SetRate (static_cast<uint8_t> (rate));
325  }
326 
327  uint16_t channelFlags = 0;
328  switch (rate)
329  {
330  case 2: //1Mbps
331  case 4: //2Mbps
332  case 10: //5Mbps
333  case 22: //11Mbps
334  channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
335  break;
336  default:
337  channelFlags |= RadiotapHeader::CHANNEL_FLAG_OFDM;
338  break;
339  }
340 
341  if (channelFreqMhz < 2500)
342  {
344  }
345  else
346  {
348  }
349 
350  header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
351 
352  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
353  {
354  uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
355  uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
356 
358 
360  if (txVector.GetChannelWidth () == 40)
361  {
363  }
364 
366  if (txVector.GetGuardInterval () == 400)
367  {
369  }
370 
372  if (preamble == WIFI_PREAMBLE_HT_GF)
373  {
375  }
376 
377  mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
378  if (txVector.GetNess () & 0x01) //bit 1
379  {
381  }
382  if (txVector.GetNess () & 0x02) //bit 2
383  {
385  }
386 
387  mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
388 
389  mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
390  if (txVector.IsStbc ())
391  {
393  }
394 
395  header.SetMcsFields (mcsKnown, mcsFlags, txVector.GetMode ().GetMcsValue ());
396  }
397 
398  if (txVector.IsAggregation ())
399  {
400  uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
401  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
402  /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
404  uint32_t extractedLength;
405  packet->RemoveHeader (hdr);
406  extractedLength = hdr.GetLength ();
407  packet = packet->CreateFragment (0, static_cast<uint32_t> (extractedLength));
408  if (aMpdu.type == LAST_MPDU_IN_AGGREGATE || (hdr.GetEof () == true && hdr.GetLength () > 0))
409  {
410  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
411  }
412  header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, 1 /*CRC*/);
413  }
414 
415  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
416  {
417  uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
418  uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
419  uint8_t vhtBandwidth = 0;
420  uint8_t vhtMcsNss[4] = {0,0,0,0};
421  uint8_t vhtCoding = 0;
422  uint8_t vhtGroupId = 0;
423  uint16_t vhtPartialAid = 0;
424 
425  vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
426  if (txVector.IsStbc ())
427  {
428  vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
429  }
430 
432  if (txVector.GetGuardInterval () == 400)
433  {
435  }
436 
437  vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
438 
440  //not all bandwidth values are currently supported
441  if (txVector.GetChannelWidth () == 40)
442  {
443  vhtBandwidth = 1;
444  }
445  else if (txVector.GetChannelWidth () == 80)
446  {
447  vhtBandwidth = 4;
448  }
449  else if (txVector.GetChannelWidth () == 160)
450  {
451  vhtBandwidth = 11;
452  }
453 
454  //only SU PPDUs are currently supported
455  vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
456  vhtMcsNss[0] |= ((txVector.GetMode ().GetMcsValue () << 4) & 0xf0);
457 
458  header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
459  }
460 
461  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HE)
462  {
464  if (preamble == WIFI_PREAMBLE_HE_ER_SU)
465  {
467  }
468  else if (preamble == WIFI_PREAMBLE_HE_MU)
469  {
471  }
472  else if (preamble == WIFI_PREAMBLE_HE_TB)
473  {
475  }
476 
478 
479  uint16_t data3 = 0;
480  if (txVector.IsStbc ())
481  {
483  }
484 
485  uint16_t data5 = 0;
486  if (txVector.GetChannelWidth () == 40)
487  {
489  }
490  else if (txVector.GetChannelWidth () == 80)
491  {
493  }
494  else if (txVector.GetChannelWidth () == 160)
495  {
497  }
498  if (txVector.GetGuardInterval () == 1600)
499  {
501  }
502  else if (txVector.GetGuardInterval () == 3200)
503  {
505  }
506 
507  header.SetHeFields (data1, data2, data3, data5);
508  }
509 
510  return header;
511 }
512 
513 void
515 {
516  switch (dlt)
517  {
518  case DLT_IEEE802_11:
520  return;
521  case DLT_PRISM_HEADER:
523  return;
526  return;
527  default:
528  NS_ABORT_MSG ("WifiPhyHelper::SetPcapFormat(): Unexpected format");
529  }
530 }
531 
534 {
535  return m_pcapDlt;
536 }
537 
538 void
539 WifiPhyHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
540 {
541  NS_LOG_FUNCTION (this << prefix << nd << promiscuous << explicitFilename);
542 
543  //All of the Pcap enable functions vector through here including the ones
544  //that are wandering through all of devices on perhaps all of the nodes in
545  //the system. We can only deal with devices of type WifiNetDevice.
546  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
547  if (device == 0)
548  {
549  NS_LOG_INFO ("WifiHelper::EnablePcapInternal(): Device " << &device << " not of type ns3::WifiNetDevice");
550  return;
551  }
552 
553  Ptr<WifiPhy> phy = device->GetPhy ();
554  NS_ABORT_MSG_IF (phy == 0, "WifiPhyHelper::EnablePcapInternal(): Phy layer in WifiNetDevice must be set");
555 
556  PcapHelper pcapHelper;
557 
558  std::string filename;
559  if (explicitFilename)
560  {
561  filename = prefix;
562  }
563  else
564  {
565  filename = pcapHelper.GetFilenameFromDevice (prefix, device);
566  }
567 
568  Ptr<PcapFileWrapper> file = pcapHelper.CreateFile (filename, std::ios::out, m_pcapDlt);
569 
570  phy->TraceConnectWithoutContext ("MonitorSnifferTx", MakeBoundCallback (&WifiPhyHelper::PcapSniffTxEvent, file));
571  phy->TraceConnectWithoutContext ("MonitorSnifferRx", MakeBoundCallback (&WifiPhyHelper::PcapSniffRxEvent, file));
572 }
573 
574 void
577  std::string prefix,
578  Ptr<NetDevice> nd,
579  bool explicitFilename)
580 {
581  //All of the ascii enable functions vector through here including the ones
582  //that are wandering through all of devices on perhaps all of the nodes in
583  //the system. We can only deal with devices of type WifiNetDevice.
584  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
585  if (device == 0)
586  {
587  NS_LOG_INFO ("WifiHelper::EnableAsciiInternal(): Device " << device << " not of type ns3::WifiNetDevice");
588  return;
589  }
590 
591  //Our trace sinks are going to use packet printing, so we have to make sure
592  //that is turned on.
594 
595  uint32_t nodeid = nd->GetNode ()->GetId ();
596  uint32_t deviceid = nd->GetIfIndex ();
597  std::ostringstream oss;
598 
599  //If we are not provided an OutputStreamWrapper, we are expected to create
600  //one using the usual trace filename conventions and write our traces
601  //without a context since there will be one file per context and therefore
602  //the context would be redundant.
603  if (stream == 0)
604  {
605  //Set up an output stream object to deal with private ofstream copy
606  //constructor and lifetime issues. Let the helper decide the actual
607  //name of the file given the prefix.
608  AsciiTraceHelper asciiTraceHelper;
609 
610  std::string filename;
611  if (explicitFilename)
612  {
613  filename = prefix;
614  }
615  else
616  {
617  filename = asciiTraceHelper.GetFilenameFromDevice (prefix, device);
618  }
619 
620  Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
621  //We could go poking through the phy and the state looking for the
622  //correct trace source, but we can let Config deal with that with
623  //some search cost. Since this is presumably happening at topology
624  //creation time, it doesn't seem much of a price to pay.
625  oss.str ("");
626  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
628 
629  oss.str ("");
630  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
632 
633  return;
634  }
635 
636  //If we are provided an OutputStreamWrapper, we are expected to use it, and
637  //to provide a context. We are free to come up with our own context if we
638  //want, and use the AsciiTraceHelper Hook*WithContext functions, but for
639  //compatibility and simplicity, we just use Config::Connect and let it deal
640  //with coming up with a context.
641  oss.str ("");
642  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
644 
645  oss.str ("");
646  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
648 }
649 
651 {
652 }
653 
655  : m_standard (WIFI_PHY_STANDARD_80211a),
656  m_selectQueueCallback (&SelectQueueByDSField)
657 {
658  SetRemoteStationManager ("ns3::ArfWifiManager");
659  SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector");
660  SetAckPolicySelectorForAc (AC_BK, "ns3::ConstantWifiAckPolicySelector");
661  SetAckPolicySelectorForAc (AC_VI, "ns3::ConstantWifiAckPolicySelector");
662  SetAckPolicySelectorForAc (AC_VO, "ns3::ConstantWifiAckPolicySelector");
663 }
664 
665 void
667  std::string n0, const AttributeValue &v0,
668  std::string n1, const AttributeValue &v1,
669  std::string n2, const AttributeValue &v2,
670  std::string n3, const AttributeValue &v3,
671  std::string n4, const AttributeValue &v4,
672  std::string n5, const AttributeValue &v5,
673  std::string n6, const AttributeValue &v6,
674  std::string n7, const AttributeValue &v7)
675 {
678  m_stationManager.Set (n0, v0);
679  m_stationManager.Set (n1, v1);
680  m_stationManager.Set (n2, v2);
681  m_stationManager.Set (n3, v3);
682  m_stationManager.Set (n4, v4);
683  m_stationManager.Set (n5, v5);
684  m_stationManager.Set (n6, v6);
685  m_stationManager.Set (n7, v7);
686 }
687 
688 void
690  std::string n0, const AttributeValue &v0,
691  std::string n1, const AttributeValue &v1,
692  std::string n2, const AttributeValue &v2,
693  std::string n3, const AttributeValue &v3,
694  std::string n4, const AttributeValue &v4,
695  std::string n5, const AttributeValue &v5,
696  std::string n6, const AttributeValue &v6,
697  std::string n7, const AttributeValue &v7)
698 {
701  m_obssPdAlgorithm.Set (n0, v0);
702  m_obssPdAlgorithm.Set (n1, v1);
703  m_obssPdAlgorithm.Set (n2, v2);
704  m_obssPdAlgorithm.Set (n3, v3);
705  m_obssPdAlgorithm.Set (n4, v4);
706  m_obssPdAlgorithm.Set (n5, v5);
707  m_obssPdAlgorithm.Set (n6, v6);
708  m_obssPdAlgorithm.Set (n7, v7);
709 }
710 
711 void
713  std::string n0, const AttributeValue &v0,
714  std::string n1, const AttributeValue &v1,
715  std::string n2, const AttributeValue &v2,
716  std::string n3, const AttributeValue &v3,
717  std::string n4, const AttributeValue &v4,
718  std::string n5, const AttributeValue &v5,
719  std::string n6, const AttributeValue &v6,
720  std::string n7, const AttributeValue &v7)
721 {
723  m_ackPolicySelector[ac].SetTypeId (type);
724  m_ackPolicySelector[ac].Set (n0, v0);
725  m_ackPolicySelector[ac].Set (n1, v1);
726  m_ackPolicySelector[ac].Set (n2, v2);
727  m_ackPolicySelector[ac].Set (n3, v3);
728  m_ackPolicySelector[ac].Set (n4, v4);
729  m_ackPolicySelector[ac].Set (n5, v5);
730  m_ackPolicySelector[ac].Set (n6, v6);
731  m_ackPolicySelector[ac].Set (n7, v7);
732 }
733 
734 void
736 {
737  m_standard = standard;
738 }
739 
740 void
742 {
744 }
745 
748  const WifiMacHelper &macHelper,
750  NodeContainer::Iterator last) const
751 {
753  for (NodeContainer::Iterator i = first; i != last; ++i)
754  {
755  Ptr<Node> node = *i;
756  Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
758  {
759  Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
760  device->SetHtConfiguration (htConfiguration);
761  }
763  {
764  Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration> ();
765  device->SetVhtConfiguration (vhtConfiguration);
766  }
768  {
769  Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
770  device->SetHeConfiguration (heConfiguration);
771  }
773  Ptr<WifiMac> mac = macHelper.Create (device);
774  Ptr<WifiPhy> phy = phyHelper.Create (node, device);
775  mac->SetAddress (Mac48Address::Allocate ());
776  mac->ConfigureStandard (m_standard);
777  phy->ConfigureStandard (m_standard);
778  device->SetMac (mac);
779  device->SetPhy (phy);
780  device->SetRemoteStationManager (manager);
781  node->AddDevice (device);
783  {
785  device->AggregateObject (obssPdAlgorithm);
786  obssPdAlgorithm->ConnectWifiNetDevice (device);
787  }
788  devices.Add (device);
789  NS_LOG_DEBUG ("node=" << node << ", mob=" << node->GetObject<MobilityModel> ());
790  // Aggregate a NetDeviceQueueInterface object if a RegularWifiMac is installed
791  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
792  if (rmac)
793  {
795  BooleanValue qosSupported;
796  PointerValue ptr;
797  Ptr<WifiMacQueue> wmq;
798  Ptr<WifiAckPolicySelector> ackSelector;
799 
800  rmac->GetAttributeFailSafe ("QosSupported", qosSupported);
801  if (qosSupported.Get ())
802  {
803  ndqi = CreateObjectWithAttributes<NetDeviceQueueInterface> ("NTxQueues",
804  UintegerValue (4));
805 
806  rmac->GetAttributeFailSafe ("BE_Txop", ptr);
808  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
809  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
810  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
811  ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
812 
813  rmac->GetAttributeFailSafe ("BK_Txop", ptr);
815  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
816  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
817  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
818  ndqi->GetTxQueue (1)->ConnectQueueTraces (wmq);
819 
820  rmac->GetAttributeFailSafe ("VI_Txop", ptr);
822  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
823  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
824  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
825  ndqi->GetTxQueue (2)->ConnectQueueTraces (wmq);
826 
827  rmac->GetAttributeFailSafe ("VO_Txop", ptr);
829  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
830  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
831  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
832  ndqi->GetTxQueue (3)->ConnectQueueTraces (wmq);
833  ndqi->SetSelectQueueCallback (m_selectQueueCallback);
834  }
835  else
836  {
837  ndqi = CreateObject<NetDeviceQueueInterface> ();
838 
839  rmac->GetAttributeFailSafe ("Txop", ptr);
840  wmq = ptr.Get<Txop> ()->GetWifiMacQueue ();
841  ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
842  }
843  device->AggregateObject (ndqi);
844  }
845  }
846  return devices;
847 }
848 
851  const WifiMacHelper &macHelper, NodeContainer c) const
852 {
853  return Install (phyHelper, macHelper, c.Begin (), c.End ());
854 }
855 
858  const WifiMacHelper &mac, Ptr<Node> node) const
859 {
860  return Install (phy, mac, NodeContainer (node));
861 }
862 
865  const WifiMacHelper &mac, std::string nodeName) const
866 {
867  Ptr<Node> node = Names::Find<Node> (nodeName);
868  return Install (phy, mac, NodeContainer (node));
869 }
870 
871 void
873 {
876 
877  LogComponentEnable ("AarfWifiManager", LOG_LEVEL_ALL);
878  LogComponentEnable ("AarfcdWifiManager", LOG_LEVEL_ALL);
879  LogComponentEnable ("AdhocWifiMac", LOG_LEVEL_ALL);
880  LogComponentEnable ("AmrrWifiManager", LOG_LEVEL_ALL);
881  LogComponentEnable ("ApWifiMac", LOG_LEVEL_ALL);
882  LogComponentEnable ("AparfWifiManager", LOG_LEVEL_ALL);
883  LogComponentEnable ("ArfWifiManager", LOG_LEVEL_ALL);
884  LogComponentEnable ("BlockAckAgreement", LOG_LEVEL_ALL);
885  LogComponentEnable ("BlockAckCache", LOG_LEVEL_ALL);
886  LogComponentEnable ("BlockAckManager", LOG_LEVEL_ALL);
887  LogComponentEnable ("CaraWifiManager", LOG_LEVEL_ALL);
888  LogComponentEnable ("ConstantObssPdAlgorithm", LOG_LEVEL_ALL);
889  LogComponentEnable ("ConstantRateWifiManager", LOG_LEVEL_ALL);
891  LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
892  LogComponentEnable ("DsssErrorRateModel", LOG_LEVEL_ALL);
893  LogComponentEnable ("QosTxop", LOG_LEVEL_ALL);
894  LogComponentEnable ("IdealWifiManager", LOG_LEVEL_ALL);
895  LogComponentEnable ("InfrastructureWifiMac", LOG_LEVEL_ALL);
896  LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
897  LogComponentEnable ("MacLow", LOG_LEVEL_ALL);
898  LogComponentEnable ("MacRxMiddle", LOG_LEVEL_ALL);
899  LogComponentEnable ("MacTxMiddle", LOG_LEVEL_ALL);
900  LogComponentEnable ("MinstrelHtWifiManager", LOG_LEVEL_ALL);
901  LogComponentEnable ("MinstrelWifiManager", LOG_LEVEL_ALL);
902  LogComponentEnable ("MpduAggregator", LOG_LEVEL_ALL);
903  LogComponentEnable ("MsduAggregator", LOG_LEVEL_ALL);
904  LogComponentEnable ("NistErrorRateModel", LOG_LEVEL_ALL);
905  LogComponentEnable ("ObssPdAlgorithm", LOG_LEVEL_ALL);
906  LogComponentEnable ("OnoeWifiManager", LOG_LEVEL_ALL);
907  LogComponentEnable ("ParfWifiManager", LOG_LEVEL_ALL);
908  LogComponentEnable ("RegularWifiMac", LOG_LEVEL_ALL);
909  LogComponentEnable ("RraaWifiManager", LOG_LEVEL_ALL);
910  LogComponentEnable ("RrpaaWifiManager", LOG_LEVEL_ALL);
911  LogComponentEnable ("SimpleFrameCaptureModel", LOG_LEVEL_ALL);
912  LogComponentEnable ("SpectrumWifiPhy", LOG_LEVEL_ALL);
913  LogComponentEnable ("StaWifiMac", LOG_LEVEL_ALL);
914  LogComponentEnable ("SupportedRates", LOG_LEVEL_ALL);
915  LogComponentEnable ("ThresholdPreambleDetectionModel", LOG_LEVEL_ALL);
916  LogComponentEnable ("WifiMac", LOG_LEVEL_ALL);
917  LogComponentEnable ("WifiMacQueueItem", LOG_LEVEL_ALL);
918  LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL);
919  LogComponentEnable ("WifiPhyStateHelper", LOG_LEVEL_ALL);
920  LogComponentEnable ("WifiPhy", LOG_LEVEL_ALL);
921  LogComponentEnable ("WifiPpdu", LOG_LEVEL_ALL);
922  LogComponentEnable ("WifiPsdu", LOG_LEVEL_ALL);
923  LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_ALL);
924  LogComponentEnable ("WifiRemoteStationManager", LOG_LEVEL_ALL);
925  LogComponentEnable ("WifiSpectrumPhyInterface", LOG_LEVEL_ALL);
926  LogComponentEnable ("WifiSpectrumSignalParameters", LOG_LEVEL_ALL);
927  LogComponentEnable ("WifiTxCurrentModel", LOG_LEVEL_ALL);
928  LogComponentEnable ("YansErrorRateModel", LOG_LEVEL_ALL);
929  LogComponentEnable ("YansWifiChannel", LOG_LEVEL_ALL);
930  LogComponentEnable ("YansWifiPhy", LOG_LEVEL_ALL);
931 }
932 
933 int64_t
935 {
936  int64_t currentStream = stream;
937  Ptr<NetDevice> netDevice;
938  for (NetDeviceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
939  {
940  netDevice = (*i);
941  Ptr<WifiNetDevice> wifi = DynamicCast<WifiNetDevice> (netDevice);
942  if (wifi)
943  {
944  //Handle any random numbers in the PHY objects.
945  currentStream += wifi->GetPhy ()->AssignStreams (currentStream);
946 
947  //Handle any random numbers in the station managers.
948  Ptr<WifiRemoteStationManager> manager = wifi->GetRemoteStationManager ();
949  Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager> (manager);
950  if (minstrel)
951  {
952  currentStream += minstrel->AssignStreams (currentStream);
953  }
954 
955  Ptr<MinstrelHtWifiManager> minstrelHt = DynamicCast<MinstrelHtWifiManager> (manager);
956  if (minstrelHt)
957  {
958  currentStream += minstrelHt->AssignStreams (currentStream);
959  }
960 
961  //Handle any random numbers in the MAC objects.
962  Ptr<WifiMac> mac = wifi->GetMac ();
963  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
964  if (rmac)
965  {
966  PointerValue ptr;
967  rmac->GetAttribute ("Txop", ptr);
968  Ptr<Txop> txop = ptr.Get<Txop> ();
969  currentStream += txop->AssignStreams (currentStream);
970 
971  rmac->GetAttribute ("VO_Txop", ptr);
972  Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
973  currentStream += vo_txop->AssignStreams (currentStream);
974 
975  rmac->GetAttribute ("VI_Txop", ptr);
976  Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
977  currentStream += vi_txop->AssignStreams (currentStream);
978 
979  rmac->GetAttribute ("BE_Txop", ptr);
980  Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
981  currentStream += be_txop->AssignStreams (currentStream);
982 
983  rmac->GetAttribute ("BK_Txop", ptr);
984  Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
985  currentStream += bk_txop->AssignStreams (currentStream);
986 
987  //if an AP, handle any beacon jitter
988  Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (rmac);
989  if (apmac)
990  {
991  currentStream += apmac->AssignStreams (currentStream);
992  }
993  }
994  }
995  }
996  return (currentStream - stream);
997 }
998 
999 } //namespace ns3
virtual ~WifiPhyHelper()
Definition: wifi-helper.cc:138
MpduInfo structure.
Definition: wifi-phy.h:76
WifiPhyStandard m_standard
wifi standard
Definition: wifi-helper.h:509
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:143
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:195
double signal
in dBm
Definition: wifi-phy.h:71
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:161
#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
#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:747
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:110
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:689
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:666
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:650
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:45
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1847
PcapHelper::DataLinkType m_pcapDlt
PCAP data link type.
Definition: wifi-helper.h:289
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:92
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:355
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 SetHtConfiguration(Ptr< HtConfiguration > htConfiguration)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
HE PHY for the 2.4 GHz band (clause 26)
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:89
#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:162
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...
VHT PHY (Clause 22)
Definition: wifi-mode.h:60
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:236
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...
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
Video.
Definition: qos-utils.h:45
Voice.
Definition: qos-utils.h:47
Best Effort.
Definition: qos-utils.h:41
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:97
WifiHelper()
Create a Wifi helper in an empty state: all its parameters must be set before calling ns3::WifiHelper...
Definition: wifi-helper.cc:654
virtual void EnableAsciiInternal(Ptr< OutputStreamWrapper > stream, std::string prefix, Ptr< NetDevice > nd, bool explicitFilename)
Enable ascii trace output on the indicated net device.
Definition: wifi-helper.cc:575
phy
Definition: third.py:93
ObjectFactory m_preambleDetectionModel
preamble detection model
Definition: wifi-helper.h:238
static void PcapSniffTxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu)
Definition: wifi-helper.cc:224
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)
virtual void SetStandard(WifiPhyStandard standard)
Definition: wifi-helper.cc:735
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
Definition: wifi-preamble.h:32
Keep track of the current position and velocity of an object.
Background.
Definition: qos-utils.h:43
WifiPhyStandard
Identifies the PHY specification that a Wifi device is configured to use.
HE PHY for the 5 GHz band (clause 26)
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:370
static Mac48Address Allocate(void)
Allocate a new Mac48Address.
bool GetEof(void) const
Return the EOF field.
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:332
Iterator Begin(void) const
Get an iterator which refers to the first NetDevice in the container.
This frame is the last subframe.
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.
static void PcapSniffRxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise)
Definition: wifi-helper.cc:256
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:172
WifiMode GetMode(void) const
Introspection did not find any typical Config paths.
HT PHY (Clause 20)
Definition: wifi-mode.h:58
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 ...
Definition: wifi-helper.cc:934
Hold together all Wifi-related objects.
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:862
ObjectFactory m_obssPdAlgorithm
OBSS PD algorithm.
Definition: wifi-helper.h:511
PcapHelper::DataLinkType GetPcapDataLinkType(void) const
Get the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:533
hold a list of per-remote-station state.
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:494
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:873
Include Prism monitor mode information.
Definition: wifi-helper.h:178
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:461
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
static RadiotapHeader GetRadiotapHeader(Ptr< Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu)
Get the radiotap header.
Definition: wifi-helper.cc:291
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:394
Prefix all trace prints with simulation time.
Definition: log.h:119
OFDM PHY for the 5 GHz band (Clause 17)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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:164
Ness data - bit 1 (MSB) of Number of extension spatial streams.
ObjectFactory m_ackPolicySelector[4]
ack policy selector for all ACs
Definition: wifi-helper.h:508
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
SelectQueueCallback m_selectQueueCallback
select queue callback
Definition: wifi-helper.h:510
void SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs)
Set the MCS fields.
void Set(std::string name, const AttributeValue &value)
Set an attribute to be set during construction.
ObjectFactory m_stationManager
station manager
Definition: wifi-helper.h:507
create MAC layers for a ns3::WifiNetDevice.
Ness known (Number of extension spatial streams)
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:193
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:514
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:149
bool IsTypeIdSet(void) const
Check if the ObjectFactory has been configured with a TypeId.
virtual void EnablePcapInternal(std::string prefix, Ptr< NetDevice > nd, bool promiscuous, bool explicitFilename)
Enable pcap output the indicated net device.
Definition: wifi-helper.cc:539
ObjectFactory m_phy
PHY object.
Definition: wifi-helper.h:235
virtual Ptr< WifiMac > Create(Ptr< NetDevice > device) const
Space-time block coding (1 if all spatial streams of all users have STBC, 0 otherwise).
wifi
Definition: third.py:96
Instantiate subclasses of ns3::Object.
void SetPhy(const Ptr< WifiPhy > phy)
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:872
virtual Ptr< WifiPhy > Create(Ptr< Node > node, Ptr< NetDevice > device) const =0
void SetSelectQueueCallback(SelectQueueCallback f)
Definition: wifi-helper.cc:741
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:128
#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: wifi-phy.h:69
uint32_t mpduRefNumber
MPDU ref number.
Definition: wifi-phy.h:79
The MPDU is the last aggregate in an A-MPDU with muliple 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:177
Ptr< T > Get(void) const
Definition: pointer.h:201
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:237
double noise
in dBm
Definition: wifi-phy.h:72
std::function< std::size_t(Ptr< QueueItem >)> SelectQueueCallback
Callback invoked to determine the MAC queue selected for a given packet.
Definition: wifi-helper.h:413
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:175
devices
Definition: first.py:39
void DisablePreambleDetectionModel()
Disable the preamble detection model.
Definition: wifi-helper.cc:218
WifiAckPolicySelector is in charge of selecting the acknowledgment policy for PSDUs containing QoS Da...
Definition: first.py:1
MpduType type
type
Definition: wifi-phy.h:78
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:472
void SetAckPolicySelectorForAc(AcIndex ac, 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:712
void SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc)
Set the A-MPDU status fields.
void SetHeFields(uint16_t data1, uint16_t data2, uint16_t data3, uint16_t data5)
Set the HE fields.
a unique identifier for an interface.
Definition: type-id.h:58
Include Radiotap link layer information.
Definition: wifi-helper.h:179
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:47
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition: qos-utils.h:38
void SetVhtConfiguration(Ptr< VhtConfiguration > vhtConfiguration)
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
HE PHY (Clause 26)
Definition: wifi-mode.h:62
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:150
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.
uint8_t GetNss(void) const
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:68