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;
246  GetRadiotapHeader (header, p, channelFreqMhz, txVector, aMpdu);
247  p->AddHeader (header);
248  file->Write (Simulator::Now (), p);
249  return;
250  }
251  default:
252  NS_ABORT_MSG ("PcapSniffTxEvent(): Unexpected data link type " << dlt);
253  }
254 }
255 
256 void
259  Ptr<const Packet> packet,
260  uint16_t channelFreqMhz,
261  WifiTxVector txVector,
262  MpduInfo aMpdu,
263  SignalNoiseDbm signalNoise)
264 {
265  uint32_t dlt = file->GetDataLinkType ();
266  switch (dlt)
267  {
269  file->Write (Simulator::Now (), packet);
270  return;
272  {
273  NS_FATAL_ERROR ("PcapSniffRxEvent(): DLT_PRISM_HEADER not implemented");
274  return;
275  }
277  {
278  Ptr<Packet> p = packet->Copy ();
279  RadiotapHeader header;
280  GetRadiotapHeader (header, p, channelFreqMhz, txVector, aMpdu, signalNoise);
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 
290 void
292  RadiotapHeader &header,
293  Ptr<Packet> packet,
294  uint16_t channelFreqMhz,
295  WifiTxVector txVector,
296  MpduInfo aMpdu,
297  SignalNoiseDbm signalNoise)
298 {
299  header.SetAntennaSignalPower (signalNoise.signal);
300  header.SetAntennaNoisePower (signalNoise.noise);
301  GetRadiotapHeader (header, packet, channelFreqMhz, txVector, aMpdu);
302 }
303 
304 void
306  RadiotapHeader &header,
307  Ptr<Packet> packet,
308  uint16_t channelFreqMhz,
309  WifiTxVector txVector,
310  MpduInfo aMpdu)
311 {
312  WifiPreamble preamble = txVector.GetPreambleType ();
313 
314  uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
315  header.SetTsft (Simulator::Now ().GetMicroSeconds ());
316 
317  //Our capture includes the FCS, so we set the flag to say so.
319 
320  if (preamble == WIFI_PREAMBLE_SHORT)
321  {
323  }
324 
325  if (txVector.GetGuardInterval () == 400)
326  {
328  }
329 
330  header.SetFrameFlags (frameFlags);
331 
332  uint64_t rate = 0;
333  if (txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT
334  && txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_VHT
335  && txVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HE)
336  {
337  rate = txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1) * txVector.GetNss () / 500000;
338  header.SetRate (static_cast<uint8_t> (rate));
339  }
340 
341  uint16_t channelFlags = 0;
342  switch (rate)
343  {
344  case 2: //1Mbps
345  case 4: //2Mbps
346  case 10: //5Mbps
347  case 22: //11Mbps
348  channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
349  break;
350  default:
351  channelFlags |= RadiotapHeader::CHANNEL_FLAG_OFDM;
352  break;
353  }
354 
355  if (channelFreqMhz < 2500)
356  {
358  }
359  else
360  {
362  }
363 
364  header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
365 
366  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
367  {
368  uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
369  uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
370 
372 
374  if (txVector.GetChannelWidth () == 40)
375  {
377  }
378 
380  if (txVector.GetGuardInterval () == 400)
381  {
383  }
384 
386  if (preamble == WIFI_PREAMBLE_HT_GF)
387  {
389  }
390 
391  mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
392  if (txVector.GetNess () & 0x01) //bit 1
393  {
395  }
396  if (txVector.GetNess () & 0x02) //bit 2
397  {
399  }
400 
401  mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
402 
403  mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
404  if (txVector.IsStbc ())
405  {
407  }
408 
409  header.SetMcsFields (mcsKnown, mcsFlags, txVector.GetMode ().GetMcsValue ());
410  }
411 
412  if (txVector.IsAggregation ())
413  {
414  uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
415  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
416  /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
418  uint32_t extractedLength;
419  packet->RemoveHeader (hdr);
420  extractedLength = hdr.GetLength ();
421  packet = packet->CreateFragment (0, static_cast<uint32_t> (extractedLength));
422  if (aMpdu.type == LAST_MPDU_IN_AGGREGATE || (hdr.GetEof () == true && hdr.GetLength () > 0))
423  {
424  ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
425  }
426  header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, 1 /*CRC*/);
427  }
428 
429  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
430  {
431  uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
432  uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
433  uint8_t vhtBandwidth = 0;
434  uint8_t vhtMcsNss[4] = {0,0,0,0};
435  uint8_t vhtCoding = 0;
436  uint8_t vhtGroupId = 0;
437  uint16_t vhtPartialAid = 0;
438 
439  vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
440  if (txVector.IsStbc ())
441  {
442  vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
443  }
444 
446  if (txVector.GetGuardInterval () == 400)
447  {
449  }
450 
451  vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
452 
454  //not all bandwidth values are currently supported
455  if (txVector.GetChannelWidth () == 40)
456  {
457  vhtBandwidth = 1;
458  }
459  else if (txVector.GetChannelWidth () == 80)
460  {
461  vhtBandwidth = 4;
462  }
463  else if (txVector.GetChannelWidth () == 160)
464  {
465  vhtBandwidth = 11;
466  }
467 
468  //only SU PPDUs are currently supported
469  vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
470  vhtMcsNss[0] |= ((txVector.GetMode ().GetMcsValue () << 4) & 0xf0);
471 
472  header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
473  }
474 
475  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HE)
476  {
478  if (preamble == WIFI_PREAMBLE_HE_ER_SU)
479  {
481  }
482  else if (preamble == WIFI_PREAMBLE_HE_MU)
483  {
485  }
486  else if (preamble == WIFI_PREAMBLE_HE_TB)
487  {
489  }
490 
492 
493  uint16_t data3 = 0;
494  if (txVector.IsStbc ())
495  {
497  }
498 
499  uint16_t data5 = 0;
500  if (txVector.GetChannelWidth () == 40)
501  {
503  }
504  else if (txVector.GetChannelWidth () == 80)
505  {
507  }
508  else if (txVector.GetChannelWidth () == 160)
509  {
511  }
512  if (txVector.GetGuardInterval () == 1600)
513  {
515  }
516  else if (txVector.GetGuardInterval () == 3200)
517  {
519  }
520 
521  header.SetHeFields (data1, data2, data3, data5);
522  }
523 }
524 
525 void
527 {
528  switch (dlt)
529  {
530  case DLT_IEEE802_11:
532  return;
533  case DLT_PRISM_HEADER:
535  return;
538  return;
539  default:
540  NS_ABORT_MSG ("WifiPhyHelper::SetPcapFormat(): Unexpected format");
541  }
542 }
543 
546 {
547  return m_pcapDlt;
548 }
549 
550 void
551 WifiPhyHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
552 {
553  NS_LOG_FUNCTION (this << prefix << nd << promiscuous << explicitFilename);
554 
555  //All of the Pcap enable functions vector through here including the ones
556  //that are wandering through all of devices on perhaps all of the nodes in
557  //the system. We can only deal with devices of type WifiNetDevice.
558  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
559  if (device == 0)
560  {
561  NS_LOG_INFO ("WifiHelper::EnablePcapInternal(): Device " << &device << " not of type ns3::WifiNetDevice");
562  return;
563  }
564 
565  Ptr<WifiPhy> phy = device->GetPhy ();
566  NS_ABORT_MSG_IF (phy == 0, "WifiPhyHelper::EnablePcapInternal(): Phy layer in WifiNetDevice must be set");
567 
568  PcapHelper pcapHelper;
569 
570  std::string filename;
571  if (explicitFilename)
572  {
573  filename = prefix;
574  }
575  else
576  {
577  filename = pcapHelper.GetFilenameFromDevice (prefix, device);
578  }
579 
580  Ptr<PcapFileWrapper> file = pcapHelper.CreateFile (filename, std::ios::out, m_pcapDlt);
581 
582  phy->TraceConnectWithoutContext ("MonitorSnifferTx", MakeBoundCallback (&WifiPhyHelper::PcapSniffTxEvent, file));
583  phy->TraceConnectWithoutContext ("MonitorSnifferRx", MakeBoundCallback (&WifiPhyHelper::PcapSniffRxEvent, file));
584 }
585 
586 void
589  std::string prefix,
590  Ptr<NetDevice> nd,
591  bool explicitFilename)
592 {
593  //All of the ASCII enable functions vector through here including the ones
594  //that are wandering through all of devices on perhaps all of the nodes in
595  //the system. We can only deal with devices of type WifiNetDevice.
596  Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
597  if (device == 0)
598  {
599  NS_LOG_INFO ("WifiHelper::EnableAsciiInternal(): Device " << device << " not of type ns3::WifiNetDevice");
600  return;
601  }
602 
603  //Our trace sinks are going to use packet printing, so we have to make sure
604  //that is turned on.
606 
607  uint32_t nodeid = nd->GetNode ()->GetId ();
608  uint32_t deviceid = nd->GetIfIndex ();
609  std::ostringstream oss;
610 
611  //If we are not provided an OutputStreamWrapper, we are expected to create
612  //one using the usual trace filename conventions and write our traces
613  //without a context since there will be one file per context and therefore
614  //the context would be redundant.
615  if (stream == 0)
616  {
617  //Set up an output stream object to deal with private ofstream copy
618  //constructor and lifetime issues. Let the helper decide the actual
619  //name of the file given the prefix.
620  AsciiTraceHelper asciiTraceHelper;
621 
622  std::string filename;
623  if (explicitFilename)
624  {
625  filename = prefix;
626  }
627  else
628  {
629  filename = asciiTraceHelper.GetFilenameFromDevice (prefix, device);
630  }
631 
632  Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
633  //We could go poking through the PHY and the state looking for the
634  //correct trace source, but we can let Config deal with that with
635  //some search cost. Since this is presumably happening at topology
636  //creation time, it doesn't seem much of a price to pay.
637  oss.str ("");
638  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
640 
641  oss.str ("");
642  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
644 
645  return;
646  }
647 
648  //If we are provided an OutputStreamWrapper, we are expected to use it, and
649  //to provide a context. We are free to come up with our own context if we
650  //want, and use the AsciiTraceHelper Hook*WithContext functions, but for
651  //compatibility and simplicity, we just use Config::Connect and let it deal
652  //with coming up with a context.
653  oss.str ("");
654  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
656 
657  oss.str ("");
658  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/Tx";
660 }
661 
663 {
664 }
665 
667  : m_standard (WIFI_STANDARD_80211a),
668  m_selectQueueCallback (&SelectQueueByDSField)
669 {
670  SetRemoteStationManager ("ns3::ArfWifiManager");
671  SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector");
672  SetAckPolicySelectorForAc (AC_BK, "ns3::ConstantWifiAckPolicySelector");
673  SetAckPolicySelectorForAc (AC_VI, "ns3::ConstantWifiAckPolicySelector");
674  SetAckPolicySelectorForAc (AC_VO, "ns3::ConstantWifiAckPolicySelector");
675 }
676 
677 void
679  std::string n0, const AttributeValue &v0,
680  std::string n1, const AttributeValue &v1,
681  std::string n2, const AttributeValue &v2,
682  std::string n3, const AttributeValue &v3,
683  std::string n4, const AttributeValue &v4,
684  std::string n5, const AttributeValue &v5,
685  std::string n6, const AttributeValue &v6,
686  std::string n7, const AttributeValue &v7)
687 {
690  m_stationManager.Set (n0, v0);
691  m_stationManager.Set (n1, v1);
692  m_stationManager.Set (n2, v2);
693  m_stationManager.Set (n3, v3);
694  m_stationManager.Set (n4, v4);
695  m_stationManager.Set (n5, v5);
696  m_stationManager.Set (n6, v6);
697  m_stationManager.Set (n7, v7);
698 }
699 
700 void
702  std::string n0, const AttributeValue &v0,
703  std::string n1, const AttributeValue &v1,
704  std::string n2, const AttributeValue &v2,
705  std::string n3, const AttributeValue &v3,
706  std::string n4, const AttributeValue &v4,
707  std::string n5, const AttributeValue &v5,
708  std::string n6, const AttributeValue &v6,
709  std::string n7, const AttributeValue &v7)
710 {
713  m_obssPdAlgorithm.Set (n0, v0);
714  m_obssPdAlgorithm.Set (n1, v1);
715  m_obssPdAlgorithm.Set (n2, v2);
716  m_obssPdAlgorithm.Set (n3, v3);
717  m_obssPdAlgorithm.Set (n4, v4);
718  m_obssPdAlgorithm.Set (n5, v5);
719  m_obssPdAlgorithm.Set (n6, v6);
720  m_obssPdAlgorithm.Set (n7, v7);
721 }
722 
723 void
725  std::string n0, const AttributeValue &v0,
726  std::string n1, const AttributeValue &v1,
727  std::string n2, const AttributeValue &v2,
728  std::string n3, const AttributeValue &v3,
729  std::string n4, const AttributeValue &v4,
730  std::string n5, const AttributeValue &v5,
731  std::string n6, const AttributeValue &v6,
732  std::string n7, const AttributeValue &v7)
733 {
735  m_ackPolicySelector[ac].SetTypeId (type);
736  m_ackPolicySelector[ac].Set (n0, v0);
737  m_ackPolicySelector[ac].Set (n1, v1);
738  m_ackPolicySelector[ac].Set (n2, v2);
739  m_ackPolicySelector[ac].Set (n3, v3);
740  m_ackPolicySelector[ac].Set (n4, v4);
741  m_ackPolicySelector[ac].Set (n5, v5);
742  m_ackPolicySelector[ac].Set (n6, v6);
743  m_ackPolicySelector[ac].Set (n7, v7);
744 }
745 
746 void
748 {
749  m_standard = standard;
750 }
751 
752 // NS_DEPRECATED_3_32
753 void
755 {
756  switch (standard)
757  {
760  return;
763  return;
766  return;
769  return;
770  // remove the next value from WifiPhyStandard when deprecation ends
773  return;
774  // remove the next value from WifiPhyStandard when deprecation ends
777  return;
780  return;
781  default:
782  NS_FATAL_ERROR ("Unsupported value of WifiPhyStandard");
783  }
784 }
785 
786 void
788 {
790 }
791 
794  const WifiMacHelper &macHelper,
796  NodeContainer::Iterator last) const
797 {
799  for (NodeContainer::Iterator i = first; i != last; ++i)
800  {
801  Ptr<Node> node = *i;
802  Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
803  auto it = wifiStandards.find (m_standard);
804  if (it == wifiStandards.end ())
805  {
806  NS_FATAL_ERROR ("Selected standard is not defined!");
807  return devices;
808  }
809  if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211n)
810  {
811  Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
812  device->SetHtConfiguration (htConfiguration);
813  }
814  if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ac) && (it->second.phyBand != WIFI_PHY_BAND_2_4GHZ))
815  {
816  Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration> ();
817  device->SetVhtConfiguration (vhtConfiguration);
818  }
819  if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax)
820  {
821  Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
822  device->SetHeConfiguration (heConfiguration);
823  }
825  Ptr<WifiMac> mac = macHelper.Create (device);
826  Ptr<WifiPhy> phy = phyHelper.Create (node, device);
827  mac->SetAddress (Mac48Address::Allocate ());
828  mac->ConfigureStandard (m_standard);
829  phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
830  device->SetMac (mac);
831  device->SetPhy (phy);
832  device->SetRemoteStationManager (manager);
833  node->AddDevice (device);
834  if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax) && (m_obssPdAlgorithm.IsTypeIdSet ()))
835  {
837  device->AggregateObject (obssPdAlgorithm);
838  obssPdAlgorithm->ConnectWifiNetDevice (device);
839  }
840  devices.Add (device);
841  NS_LOG_DEBUG ("node=" << node << ", mob=" << node->GetObject<MobilityModel> ());
842  // Aggregate a NetDeviceQueueInterface object if a RegularWifiMac is installed
843  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
844  if (rmac)
845  {
847  BooleanValue qosSupported;
848  PointerValue ptr;
849  Ptr<WifiMacQueue> wmq;
850  Ptr<WifiAckPolicySelector> ackSelector;
851 
852  rmac->GetAttributeFailSafe ("QosSupported", qosSupported);
853  if (qosSupported.Get ())
854  {
855  ndqi = CreateObjectWithAttributes<NetDeviceQueueInterface> ("NTxQueues",
856  UintegerValue (4));
857 
858  rmac->GetAttributeFailSafe ("BE_Txop", ptr);
860  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
861  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
862  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
863  ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
864 
865  rmac->GetAttributeFailSafe ("BK_Txop", ptr);
867  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
868  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
869  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
870  ndqi->GetTxQueue (1)->ConnectQueueTraces (wmq);
871 
872  rmac->GetAttributeFailSafe ("VI_Txop", ptr);
874  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
875  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
876  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
877  ndqi->GetTxQueue (2)->ConnectQueueTraces (wmq);
878 
879  rmac->GetAttributeFailSafe ("VO_Txop", ptr);
881  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
882  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
883  wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
884  ndqi->GetTxQueue (3)->ConnectQueueTraces (wmq);
885  ndqi->SetSelectQueueCallback (m_selectQueueCallback);
886  }
887  else
888  {
889  ndqi = CreateObject<NetDeviceQueueInterface> ();
890 
891  rmac->GetAttributeFailSafe ("Txop", ptr);
892  wmq = ptr.Get<Txop> ()->GetWifiMacQueue ();
893  ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
894  }
895  device->AggregateObject (ndqi);
896  }
897  }
898  return devices;
899 }
900 
903  const WifiMacHelper &macHelper, NodeContainer c) const
904 {
905  return Install (phyHelper, macHelper, c.Begin (), c.End ());
906 }
907 
910  const WifiMacHelper &mac, Ptr<Node> node) const
911 {
912  return Install (phy, mac, NodeContainer (node));
913 }
914 
917  const WifiMacHelper &mac, std::string nodeName) const
918 {
919  Ptr<Node> node = Names::Find<Node> (nodeName);
920  return Install (phy, mac, NodeContainer (node));
921 }
922 
923 void
925 {
928 
929  LogComponentEnable ("AarfWifiManager", LOG_LEVEL_ALL);
930  LogComponentEnable ("AarfcdWifiManager", LOG_LEVEL_ALL);
931  LogComponentEnable ("AdhocWifiMac", LOG_LEVEL_ALL);
932  LogComponentEnable ("AmrrWifiManager", LOG_LEVEL_ALL);
933  LogComponentEnable ("ApWifiMac", LOG_LEVEL_ALL);
934  LogComponentEnable ("AparfWifiManager", LOG_LEVEL_ALL);
935  LogComponentEnable ("ArfWifiManager", LOG_LEVEL_ALL);
936  LogComponentEnable ("BlockAckAgreement", LOG_LEVEL_ALL);
937  LogComponentEnable ("BlockAckCache", LOG_LEVEL_ALL);
938  LogComponentEnable ("BlockAckManager", LOG_LEVEL_ALL);
939  LogComponentEnable ("CaraWifiManager", LOG_LEVEL_ALL);
940  LogComponentEnable ("ConstantObssPdAlgorithm", LOG_LEVEL_ALL);
941  LogComponentEnable ("ConstantRateWifiManager", LOG_LEVEL_ALL);
943  LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
944  LogComponentEnable ("DsssErrorRateModel", LOG_LEVEL_ALL);
945  LogComponentEnable ("QosTxop", LOG_LEVEL_ALL);
946  LogComponentEnable ("IdealWifiManager", LOG_LEVEL_ALL);
947  LogComponentEnable ("InfrastructureWifiMac", LOG_LEVEL_ALL);
948  LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
949  LogComponentEnable ("MacLow", 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 ("NistErrorRateModel", LOG_LEVEL_ALL);
957  LogComponentEnable ("ObssPdAlgorithm", LOG_LEVEL_ALL);
958  LogComponentEnable ("OnoeWifiManager", LOG_LEVEL_ALL);
959  LogComponentEnable ("ParfWifiManager", LOG_LEVEL_ALL);
960  LogComponentEnable ("RegularWifiMac", LOG_LEVEL_ALL);
961  LogComponentEnable ("RraaWifiManager", LOG_LEVEL_ALL);
962  LogComponentEnable ("RrpaaWifiManager", LOG_LEVEL_ALL);
963  LogComponentEnable ("SimpleFrameCaptureModel", LOG_LEVEL_ALL);
964  LogComponentEnable ("SpectrumWifiPhy", LOG_LEVEL_ALL);
965  LogComponentEnable ("StaWifiMac", LOG_LEVEL_ALL);
966  LogComponentEnable ("SupportedRates", LOG_LEVEL_ALL);
967  LogComponentEnable ("ThresholdPreambleDetectionModel", LOG_LEVEL_ALL);
968  LogComponentEnable ("WifiMac", LOG_LEVEL_ALL);
969  LogComponentEnable ("WifiMacQueueItem", LOG_LEVEL_ALL);
970  LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL);
971  LogComponentEnable ("WifiPhyStateHelper", LOG_LEVEL_ALL);
972  LogComponentEnable ("WifiPhy", LOG_LEVEL_ALL);
973  LogComponentEnable ("WifiPpdu", LOG_LEVEL_ALL);
974  LogComponentEnable ("WifiPsdu", LOG_LEVEL_ALL);
975  LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_ALL);
976  LogComponentEnable ("WifiRemoteStationManager", LOG_LEVEL_ALL);
977  LogComponentEnable ("WifiSpectrumPhyInterface", LOG_LEVEL_ALL);
978  LogComponentEnable ("WifiSpectrumSignalParameters", LOG_LEVEL_ALL);
979  LogComponentEnable ("WifiTxCurrentModel", LOG_LEVEL_ALL);
980  LogComponentEnable ("YansErrorRateModel", LOG_LEVEL_ALL);
981  LogComponentEnable ("YansWifiChannel", LOG_LEVEL_ALL);
982  LogComponentEnable ("YansWifiPhy", LOG_LEVEL_ALL);
983 }
984 
985 int64_t
987 {
988  int64_t currentStream = stream;
989  Ptr<NetDevice> netDevice;
990  for (NetDeviceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
991  {
992  netDevice = (*i);
993  Ptr<WifiNetDevice> wifi = DynamicCast<WifiNetDevice> (netDevice);
994  if (wifi)
995  {
996  //Handle any random numbers in the PHY objects.
997  currentStream += wifi->GetPhy ()->AssignStreams (currentStream);
998 
999  //Handle any random numbers in the station managers.
1000  Ptr<WifiRemoteStationManager> manager = wifi->GetRemoteStationManager ();
1001  Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager> (manager);
1002  if (minstrel)
1003  {
1004  currentStream += minstrel->AssignStreams (currentStream);
1005  }
1006 
1007  Ptr<MinstrelHtWifiManager> minstrelHt = DynamicCast<MinstrelHtWifiManager> (manager);
1008  if (minstrelHt)
1009  {
1010  currentStream += minstrelHt->AssignStreams (currentStream);
1011  }
1012 
1013  //Handle any random numbers in the MAC objects.
1014  Ptr<WifiMac> mac = wifi->GetMac ();
1015  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
1016  if (rmac)
1017  {
1018  PointerValue ptr;
1019  rmac->GetAttribute ("Txop", ptr);
1020  Ptr<Txop> txop = ptr.Get<Txop> ();
1021  currentStream += txop->AssignStreams (currentStream);
1022 
1023  rmac->GetAttribute ("VO_Txop", ptr);
1024  Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
1025  currentStream += vo_txop->AssignStreams (currentStream);
1026 
1027  rmac->GetAttribute ("VI_Txop", ptr);
1028  Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
1029  currentStream += vi_txop->AssignStreams (currentStream);
1030 
1031  rmac->GetAttribute ("BE_Txop", ptr);
1032  Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
1033  currentStream += be_txop->AssignStreams (currentStream);
1034 
1035  rmac->GetAttribute ("BK_Txop", ptr);
1036  Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
1037  currentStream += bk_txop->AssignStreams (currentStream);
1038 
1039  //if an AP, handle any beacon jitter
1040  Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (rmac);
1041  if (apmac)
1042  {
1043  currentStream += apmac->AssignStreams (currentStream);
1044  }
1045  }
1046  }
1047  }
1048  return (currentStream - stream);
1049 }
1050 
1051 } //namespace ns3
virtual ~WifiPhyHelper()
Definition: wifi-helper.cc:138
ERP-OFDM PHY (Clause 19, Section 19.5)
MpduInfo structure.
Definition: wifi-phy.h:123
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:118
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
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:793
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:701
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:678
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:662
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:307
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:379
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: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: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...
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:237
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
static void GetRadiotapHeader(RadiotapHeader &header, Ptr< Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu)
Get the Radiotap header for a transmitted packet.
Definition: wifi-helper.cc:305
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:666
const std::map< WifiStandard, WifiStandardInfo > wifiStandards
map a given standard configured by the user to the corresponding WifiStandardInfo ...
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:587
phy
Definition: third.py:93
ObjectFactory m_preambleDetectionModel
preamble detection model
Definition: wifi-helper.h:239
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)
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.
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
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:257
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
Headers for A-MPDU subframes.
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:986
Hold together all Wifi-related objects.
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:899
ObjectFactory m_obssPdAlgorithm
OBSS_PD algorithm.
Definition: wifi-helper.h:556
PcapHelper::DataLinkType GetPcapDataLinkType(void) const
Get the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:545
hold a list of per-remote-station state.
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:463
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:918
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
This is intended to be the configuration used in this paper: Gavin Holland, Nitin Vaidya and Paramvir...
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.
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: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:553
DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18)
virtual void SetStandard(WifiStandard standard)
Definition: wifi-helper.cc:747
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:555
void SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs)
Set the MCS fields.
ObjectFactory m_stationManager
station manager
Definition: wifi-helper.h:552
create MAC layers for a ns3::WifiNetDevice.
Ness known (Number of extension spatial streams)
The 2.4 GHz band.
Definition: wifi-phy-band.h:33
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:526
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:551
ObjectFactory m_phy
PHY object.
Definition: wifi-helper.h:236
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:924
virtual Ptr< WifiPhy > Create(Ptr< Node > node, Ptr< NetDevice > device) const =0
void SetSelectQueueCallback(SelectQueueCallback f)
Definition: wifi-helper.cc:787
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: wifi-phy.h:116
uint32_t mpduRefNumber
MPDU ref number.
Definition: wifi-phy.h:126
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
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:238
double noise
in dBm
Definition: wifi-phy.h:119
std::function< std::size_t(Ptr< QueueItem >)> SelectQueueCallback
Callback invoked to determine the MAC queue selected for a given packet.
Definition: wifi-helper.h:431
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:218
WifiAckPolicySelector is in charge of selecting the acknowledgment policy for PSDUs containing QoS Da...
Definition: first.py:1
WifiStandard m_standard
wifi standard
Definition: wifi-helper.h:554
MpduType type
type
Definition: wifi-phy.h:125
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:441
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:724
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: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: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:119
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:66
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